Como resolver esse problema?

Bom dia pessoal, tudo bem? Estou iniciando no mundo da programação e assistindo uma aula e seguindo os passos e fazendo o código abaixo o seguinte erro aparaceu no console e não foi feito a leitura da altura.

Código:

import java.util.Scanner;

public class LeituraDadosTeclado {

	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		
		/*System.out.println("Digite seu nome completo: ");
		String nomeCompleto = scan.nextLine();
		System.out.println("Seu nome completo é: " + nomeCompleto);
		
		System.out.println("Digite seu primeiro nome: ");
		String primeiroNome = scan.next();
		System.out.println("Seu primeiro nome é: " + primeiroNome);*/
		
		System.out.println("Digite a sua idade: ");
		int idade = scan.nextInt();
		System.out.println("Sua idade é: " + idade);
		
		System.out.println("Digite a sua altura: ");
		double altura = scan.nextDouble();
		System.out.println("Sua altura é: " + altura);
		
		

	}

}

Console:

  • Digite a sua idade: 42
  • Sua idade: 42
  • Digite a sua altura: 1.8

Exception in thread “main” java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:943)
at java.base/java.util.Scanner.next(Scanner.java:1598)
at java.base/java.util.Scanner.nextDouble(Scanner.java:2569)
at com.elias.cursojava.aula12.LeituraDadosTeclado.main(LeituraDadosTeclado.java:24)

Interessante é que troquei o “.”(ponto) do “1.8” para “,”(virgula) e não deu mais erro. Que doidera!

O separador decimal que o java aceita no console (ao rodar o programa) não é fixo, ele varia conforme as configurações do sistema. No seu caso, ele deve estar usando a vírgula, que é o padrão no Brasil. Isso faz com que o ponto cause erro.

Esse outro tópico tem mais detalhes: Erro ao rodar um algoritmo com estrutura condicional em Java

Abraço.

2 curtidas

Se quiser que o programa use um separador decimal específico, basta mudar o locale (usando a classe java.util.Locale). Por exemplo:

Scanner scan = new Scanner(System.in).useLocale(Locale.US);

Locale.US equivale ao inglês americano, e portanto usa o ponto como separador decimal. Então neste caso aceitaria 1.8.

Se for para aceitar a vírgula, basta mudar para um que a use como separador decimal, como por exemplo o português brasileiro:

Scanner scan = new Scanner(System.in).useLocale(new Locale("pt", "BR"));

Agora aceita apenas 1,8.


Se você não especificar nenhum locale, é usado o que estiver configurado na JVM, e que você pode ver qual é imprimindo o valor de Locale.getDefault().

Também dá para usar Locale.setDefault() para mudar a configuração, o problema é que isso muda para toda a JVM. Então todos os lugares que usam o locale default serão afetados. Por isso, se você sabe especificamente qual usar (no caso, um que tenha o separador decimal desejado), é melhor usá-lo nos lugares onde precisa, e não depender da configuração default.

1 curtida

@hugokotsubo muito obrigado pela sua explicação! :wink:

@TerraSkilll muito obrigado pelo retorno! :wink: