di4s
(usa XUbuntu)
Enviado em 06/06/2018 - 17:06h
hcabzlus escreveu:
Ele bloqueia exatamente onde falei, por isso ele deve estar dentro do loop e por isso seu código não funciona.
Faça isso:
do {
System.out.println("digite um numero inteiro");
Scanner scanner = new Scanner(System.in);
if(scanner.hasNextInt()) {
System.out.println("valor digitado: " + scanner.nextInt());
break;
}
} while (true);
Dica: nunca use saídas de texto para testar pois elas podem facilmente te enganar. Ao invés disso, use um depurador de código.
Oi pessoal.
Hcabzlus, desculpe, mas eu acredito que isso não está correto.
A parada ( para leitura do stdin ) não ocorre na linha:
Scanner scanner = new Scanner(System.in);
Também acho que instanciar o scanner dentro do loop é uma má prática... Dessa forma, você cria diversos objetos da classe Scanner de forma desnecessária.
Robgeek, penso que a parada ocorre porquê você criou o Scanner passando o System.in, que é, de forma genérica, a entrada padrão, na maioria das vezes, o teclado... Quando você chama o método hasNextInt(), sem ter feito nenhuma leitura antes, a entrada padrão precisa ser lida para só depois ser avaliada...
Veja que usando um arquivo para criar o Scanner essa parada não acontece:
import java.util.*;
import java.io.*;
public class Teste {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner( new File( "numeros" ));
while(true) {
if(scanner.hasNextInt()) {
System.out.println("valor digitado: " + scanner.nextInt());
break;
}
else {
System.out.println("digite um numero inteiro");
}
}
}
}
Você pode criar o arquivo "numeros" com o seguinte comando no terminal :
echo {1..100} > numeros
Já o fato de acorrer um loop quando um caractere é digitado, penso que seja porquê não é feita nenhuma leitura quando o método hasNextInt() retorna false, ou seja, o caractere continua lá e o retorno continua sendo false, veja:
public static void main(String[] args) {
System.out.println("teste-01");
Scanner scanner = new Scanner(System.in);
System.out.println("teste-02");
while(true) {
System.out.println("teste-03");
Na próxima linha o método hasNextInt() é chamado e espera uma entrada. Se essa entrada for do tipo int, é retornado true senão, é retornado false.
if(scanner.hasNextInt()) {
System.out.println("teste-04");
System.out.println("valor digitado: " + scanner.nextInt());
break;
}
Se você digita um char ou um float, o retorno é false e a execução vai para o bloco else...
Nesse bloco, nenhuma leitura com Scanner acontece e o while é executado novamente, onde o método hasNextInt() é chamado outra vez e avalia o mesmo char ou float que foi inserido na primeira interação... Como o retorno desse método vai ser sempre false, a execução nunca entra no bloco if onde está a instrução break.
else {
System.out.println("digite um numero inteiro");
}
System.out.println("teste-05");
}
}
Veja que limpando( fazendo a leitura de uma linha com o Scanner ) no bloco else, o loop não acontece:
import java.util.*;
import java.io.*;
public class Teste {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner( new InputStreamReader(System.in) );
while(true) {
if(scanner.hasNextInt()) {
System.out.println("valor digitado: " + scanner.nextInt());
break;
}
else {
//usado para limpar
scanner.nextLine();
System.out.println("digite um numero inteiro");
}
}
}
}
Linux Professional Institute - LPIC-1
Novell Certified Linux Administrator - CLA
Oracle Certified Associate, Java SE Programmer - OCA
http://twitter.com/p4ulodi4s
http://www.prminformatica.com.br/