Erro durante exercicio de aula online

Olá, comecei a estudar java pelo curso da Loiane(que é bem antigo, mas ainda se encaixa bem no que ando vendo[até o momento] tirando algumas correções em relação ao eclipse, já que as vezes ele auto completa dando outras opções.) e durante um exercicio de scan no qual eu tentava fazer com que o programa conseguisse reconhecer minha resposta separada por espaços aconteceu isso: (vou deixar o codigo inteiro, o comentario que há nele é porque durante a aula foi feita a mesma coisa de outra forma).

package com.loiane.cursojava.aula12;

import java.util.Scanner;

public class LeituraDeDados {

public static void main(String[] args) {

  Scanner scan = new Scanner(System.in);
  
  /*System.out.println("Digite seu nome completo:");
  //Esse scan irá ler a próxima llinha preenchida e copiar a repoosta
  String NomeCompleto = scan.nextLine();
  //Esse comando fará com que o que foi copiado seja colado
  System.out.println("Seu nome é: " + NomeCompleto);

  System.out.println("Digite seu primeiro nome:");
  //Scan somente "next" irá copiar somente a primeira palavra falada na linha
  String PrimeiroNome = scan.next();
  System.out.println("Seu primeiro nome é: " + PrimeiroNome);
  
  System.out.println("Digite sua idade:");
  int idade = scan.nextInt();
  System.out.println("Sua Idade: " + idade);
  
  System.out.println("Digite sua altura:");
  double altura = scan.nextDouble();
  System.out.println("Sua altura é: " + altura);*/
  
  System.out.println("Digite seu primeiro nome, sua idade, quantidade de filhos, altura e se tem animal de estimação: ");
  String primeironome = scan.next();
  int idadepessoa  = scan.nextInt();
  byte filhos = scan.nextByte();
  float altura = scan.nextFloat();
  boolean pet = scan.nextBoolean();
  
  System.out.println("Você respondeu com os seguintes valores");
  System.out.println("Seu primeiro nome é: " + primeironome);
  System.out.println("Sua idade é: " + idadepessoa);
  System.out.println("Quantos filhos tem: " + filhos);
  System.out.println("Sua altura: " + altura);
  System.out.println("Se tem animal de estimação: " + pet);

}

}

Que gerou o erro
Digite seu primeiro nome, sua idade, quantidade de filhos, altura e se tem animal de estimação:

bruno 10 0 1.20 false
Exception in thread “main” java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextFloat(Scanner.java:2496)
at com.loiane.cursojava.aula12.LeituraDeDados.main(LeituraDeDados.java:34)

Testei aqui e vi o que problema ocorre quando vc invoca o nextFloat() e acredito que esteja relacionado com a localidade do nosso sistema operacional.

Eu configurei o idioma do meu sistema como Inglês, porém, configurei para que o formato da data, horas, dinheiro, etc… aparecessem no formato do Brasil mesmo.

Ou seja, no brasil usamos a vírgula para separar a parte decimal, o ponto é usado lá fora.

É por isso que quando o nextFloat() tenta converter o número 1.20 ele lança esta exceção. Eu experimetei com a seguinte entrada e funcionou:

bruno 10 0 1,20 false

Se vc quer que ele aceite o número com ponto mesmo ao invés da vírgula, sem precisar mudar a localidade do seu sistema, faça a seguinte substituição:

// Isso:
Scanner scan = new Scanner(System.in);
// Por isso:
Scanner scan = new Scanner(System.in).useLocale(Locale.US);

Eu experimentei alterar a localidade do meu sistema para US (tive que reiniciar pra sutir efeito) e seu código funcionou normalmente sem qualquer alteração.

O contraditório é que independente da localidade do seu sistema, e se vc escreve 1.20 ou 1,20, ele imprime como 1.20 de qualquer forma por padrão.


Uma observação que não tem a ver com sua dúvida é que, não sei se vc já chegou nesta parte, mas o Scanner, ao ser instanciado, aloca recursos que devem ser liberados manualmente assim que possível invocando o método close(). Tipo assim:

import java.util.Scanner;

public class Main {
  public static void main(String... args) {
    Scanner scan = new Scanner(System.in);

    System.out.println("Digite seu primeiro nome, sua idade, quantidade de filhos, altura e se tem animal de estimação: ");

    String primeironome = scan.next();
    int idadepessoa = scan.nextInt();
    byte filhos = scan.nextByte();
    float altura = scan.nextFloat();
    boolean pet = scan.nextBoolean();

    scan.close();

    System.out.println("Você respondeu com os seguintes valores");
    System.out.println("Seu primeiro nome é: " + primeironome);
    System.out.println("Sua idade é: " + idadepessoa);
    System.out.println("Quantos filhos tem: " + filhos);
    System.out.println("Sua altura: " + altura);
    System.out.println("Se tem animal de estimação: " + pet);
  }
}

Mas também é possível tirar proveito de um recurso da linguagem chamado try with resources que invoca o método close() automaticamente por nós, assim:

import java.util.Scanner;

public class Main {
  public static void main(String... args) {
    try (Scanner scan = new Scanner(System.in)) {
      System.out.println("Digite seu primeiro nome, sua idade, quantidade de filhos, altura e se tem animal de estimação: ");

      String primeironome = scan.next();
      int idadepessoa = scan.nextInt();
      byte filhos = scan.nextByte();
      float altura = scan.nextFloat();
      boolean pet = scan.nextBoolean();

      System.out.println("Você respondeu com os seguintes valores");
      System.out.println("Seu primeiro nome é: " + primeironome);
      System.out.println("Sua idade é: " + idadepessoa);
      System.out.println("Quantos filhos tem: " + filhos);
      System.out.println("Sua altura: " + altura);
      System.out.println("Se tem animal de estimação: " + pet);
    }
  }
}

Realmente, colocando “,” ao invês de “.” fica funcional mas, eu adicionei a linha que você informou e o eclipse falou que funcionaria adicionando a linha

import java.util.Locale;

Eu adicionei e reinciei o programa, porém, continua não funcionando…

Subindo esse erro:

Exception in thread “main” java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextFloat(Scanner.java:2496)
at com.loiane.cursojava.aula12.LeituraDeDados.main(LeituraDeDados.java:35)

1 curtida

Pior que eu não consigo testar no Eclipse no momento, eu fiz pela linha de comando.

Mas se vc realmente faz questão de inserir o número com ponto, poderia tentar assim:

float altura = Float.parseFloat(scan.next());