Problema com loop e try catch

Caros mestres da programação
Eu estava fazendo alguns exercícios com o Try/Catch e um método que eu fiz entra sempre em um loop infinito que eu não consigo resolver. Segue o código:

public static int obterOpcaoMenu() {

	Scanner scan = new Scanner(System.in);
	
	int o = 0;
	boolean entradaValida = false;
	
	while(!entradaValida) {
		System.out.println("Insira o numero da opção desejada: ");
		System.out.println("1 - Adicionar um contato na agenda.");
		System.out.println("2 - Consultar um contato da da agenda.");
		System.out.println("3 - Sair.");	
		
		try {
			o = scan.nextInt();
		}catch(Exception e) {
			System.out.println("Entrada invalida! Tente novamente:");
		}
		
		if (o == 1 || o == 2 || o == 3) {
			entradaValida = true; 
		}else {
			System.out.println("Entrada invalida! Tente outra vez:");
		}
		
	}
	
	return o;
}

Se eu digitar um número qualquer que seja ele funciona da maneira que eu quero, mas se eu digito uma letra ele não executa o Scanner de novo e fica em um loop eterno .

Não sou nenhum expert mas funcionou aqui. Espero que ajude :slight_smile:

try {
o = Integer.parseInt(scan.next()); // Essa linha resolve
}catch(Exception e) {
// removi a mensagem repetida.
}

	if (o == 1 || o == 2 || o == 3) {
		entradaValida = true;
		System.out.println(""); // Essa linha é pura frescura
	}else {
		System.out.println("\nNúmero invalido! Tente outra vez:\n");
	}
	
}

return o;
1 curtida

Outra alternativa:

// System.in é estático, então seu Scanner também pode ser
static final Scanner scan = new Scanner(System.in);

public static int obterOpcaoMenu() {
    while (true) {
        try {
            System.out.println("Insira o numero da opção desejada: ");
            System.out.println("1 - Adicionar um contato na agenda.");
            System.out.println("2 - Consultar um contato da da agenda.");
            System.out.println("3 - Sair.");
            int opcao = Integer.parseInt(scan.nextLine()); // procure utilizar o nextLine, para consumir a quebra de linha
            switch (opcao) {
                case 1:
                case 2:
                case 3:
                    return opcao;
            }
        } catch (Exception e) { /* ignora */ }
        System.out.println("Entrada invalida! Tente novamente:");
    }
}
1 curtida