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!
@TerraSkilll muito obrigado pelo retorno!