Não entendi o comportamento da JVM nesse caso.[RESOLVIDO]

2 respostas
guj1

Olá,

No código abaixo, se eu comentar a linha s.nextLine() resulta em loop infinito assim como abaixo.
Minha dúvida é: se quando ocorre a excessão que é capturada pelo catch o fluxo volta a entrar no try (como continua ainda é true) e executa System.out.println("Informe um numero: "), por que a instrução double a = s.nextDouble() não é executada pela JVM?

public class DividePorZero {

	public static void main(String[] args) {

		Scanner s = new Scanner(System.in);
		boolean continua = true;
		do {
			try {
				System.out.println("Informe um numero: ");
				double a = s.nextDouble();
				System.out.println("Informe o divisor: ");
				double b = s.nextDouble();
				System.out.println(a / b);
				continua = false;
			} catch (InputMismatchException e1) {
				System.out.println("Não é possível dividir um número por uma letra.");
				s.nextLine();
			}
		} while (continua);
	}
}

Loop:
Não é possível dividir um número por uma letra.
Informe um numero:
Não é possível dividir um número por uma letra.
Informe um numero:
Não é possível dividir um número por uma letra.
Informe um numero:
Não é possível dividir um número por uma letra.
Informe um numero:

Grato pela atenção.

2 Respostas

Ataxexe

Isso acontece porque, quando dá algum erro de conversão, o input continua no Scanner, dando erro em todos os “s.nextDouble()”. Por isso você precisa usar o nextLine, ele descartará o input que deu erro. Pra entender melhor, utilize o seguinte trecho no catch:

System.out.println("Não é possível dividir um número por uma letra.");  
System.out.println("'" + s.nextLine() + "'");

Exemplo de output:

guj1

Entendi.

Obrigado.

Criado 24 de fevereiro de 2015
Ultima resposta 25 de fev. de 2015
Respostas 2
Participantes 2