[Ajuda] Problema com lógica

11 respostas
InsaneChess

Prezados, boa tarde.
Eu fiz um simples programinha para praticar manuseio de exceções.
Porém não consigo entender o por que dele estar Entrando em Loop Infinito quando alguem digita uma Letra.

import java.util.Scanner;


public class Perigo {
	Scanner SS = new Scanner(System.in);
	
	
	
	public void TestarPerigo(int S) throws Exception{
		int Testar = this.SS.nextInt();
		if (S == Testar){
		System.out.println("O metodo rodou com sucesso, os numeros sao iguais.");
		}
		else{
			System.out.println("O numero digitado nao eh igual");
		}
	}

	
}
public class Principal {
	public static void main (String[] args) {
       
       Perigo Danger = new Perigo();
       System.out.println("Digite alguma coisa");	
       int ZZZ = 0;
       
        while (ZZZ == 0 ){ //Para Fazer o Programa entrar em Loop enquanto o Bloco Try não for executado.
          
    	     try{
        	   Danger.TestarPerigo(10);
               ZZZ = 1;
             }
             catch(Exception e){
           	   System.out.println("Nao digite Letras seu Burro!!!");
        	   System.out.println(e);    
        	   System.out.println("Digite novamente!");
             }
        }
        
      System.out.println("Finalizando o programa.");
	}   
	
}

O que me parece que acontece, é que no looping o método SS.NextInt() não é executado dentro do Bloco Try depois da primeira vez.
Alguem pode me explicar? Por favor.

Desde já agradeço,
Boa semana para todo mundo.

11 Respostas

kenneth

Fala brow,

Nao sei se estou correto, mas eu acho que,
como voce esta lendo um inteiro dentro da classe
“Perigo”, quando alguem digita uma letra, ele da exception
ali, e nao volta para a classe que a chamou, para entao sair do laco…

Acredito que se vc colocar um controle de excecao (try/catch por exemplo)
dentro da TestarPerigo, mais exatamente no nextInt(), vai funcionar…

Abraco!

Ygor

Boa tarde;

Creio que a maneira mais simples de tu corrigir isso(não a mais correta) seria tu colocar a linha “Scanner SS = new Scanner(System.in);” dentro do método TestarPerigo(não esquecer de tirar o this também).

romarcio

Deixa sua classe assim:

public class Perigo {


    public void TestarPerigo(int S) throws Exception {
        Scanner SS = new Scanner(System.in);
        int Testar = SS.nextInt();

        if (S == Testar) {
            System.out.println("O metodo rodou com sucesso, os numeros sao iguais.");
        } else {
            System.out.println("O numero digitado nao eh igual");
        }
    }


}
ViniGodoy

Ao ler do console, use somente o método nextLine().

Alguns professores tem ensinado o nextInt() e outros métodos similares, mas isso está errado.

Lembre-se a única terminação válida num terminal é o \n (ou \r\n, no caso do Windows), que o nextInt() não foi feito para capturar. Se você usar o nextInt() ele captura o inteiro e mantém o \n no buffer, que será lido no próximo nextLine(), o que gera depois os problemas que você vivenciou.

InsaneChess

romarcio, Muito obrigado. Funcionou perfeitamente.

Mais, o que eu gostaria de saber na real, é o motivo de não ter funcionado…
O método nextInt() não deveria ser lido para pegar os dados digitados toda vez que o método fosse iniciado, mesmo sem atribuir a variavel de referencia SS a um novo scanner?

ViniGodoy, desculpa.
Acho que o que você falou deve explicar exatamente minha dúvida acima, Porém infelizmente não consegui intender o que você tentou me passar…
Como assim manter no Buffer? Quer dizer que após ser executado pela primeira vez…todas as vezes que o método nexInt() for executado ele lançará sempre o valor já gerado na primeira vez que foi utilizado?

romarcio

É o que ViniGodoy respondeu para vc.

Se vc deixa Scanner SS = new Scanner(System.in); fora do método ele vem sujo na próxima vez.

Mas se vc coloca ele dentro do método, vc cria uma nova instancia e um objeto novo, então não pega a tal “sujeira” citada pelo Vini quando vc usa o nextInt().

ViniGodoy

Imagina que o Scanner guarda na memória (o buffer) tudo que foi digitado por seu usuário.

Seu usuário digita 10 e tecla enter, o que fica na memória é isso aqui:
10\n

Quando vc faz um nextInt(), ele lê o 10, e mantém na memória o \n:
Memória: 10\n
NextInt: 10\n
Memória: \n

Você então faz outro nextInt(). Seu usuário digita 20, e tecla enter:

Memória: \n20\n

O que o próximo nextInt vai ler? O \n do início, que sobrou de “lixo” da operação passada.

Com nextLine(), o Scanner lê até o \n. A mesma situação ficaria assim:

Memória: 10\n
NextLine: 10\n
Memória:

Usuário digita 20 e tecla enter:
Memória: 20\n
NextLine: 20\n
Memória:

O único problema é que o nextLine() sempre retorna um String. Portanto, você tem que usar o método Integer.parseInt para converter o resultado.

evertonsilvagomesjav

Fiquei curioso. Deixa eu fazer uma pergunta, nao da exceção se fizer um parseInt de (“10\n”), no caso n?

ViniGodoy

É que, da mesma forma que o split, os separadores nunca são incluídos na saída do Scanner. São só separadores.

evertonsilvagomesjav

Opa, fino!!!

InsaneChess

ViniGodoy, obrigado de verdade.
Agora intendi perfeitamente o que você tentou me ensinar.
Desculpa o incomodo.

Criado 13 de setembro de 2010
Ultima resposta 13 de set. de 2010
Respostas 11
Participantes 6