Como sair do loop while em java com o método do scanner “hasNext” como condição?

Eu sou um iniciante em programação java e se deparou com um problema estranho. Abaixo está o meu código, que pede input do usuário e imprime o que o usuário insere uma palavra por vez.

O problema é que o programa nunca acaba e, do meu entendimento limitado, parece que ele ficou preso dentro do loop while. Alguém poderia me ajudar um pouco? Desde já, obrigado.

import java.util.Scanner; public class Test{ public static void main(String args[]){ System.out.print("Enter your sentence: "); Scanner sc = new Scanner (System.in); while (sc.hasNext() == true ) { String s1 = sc.next(); System.out.println(s1); } System.out.println("The loop has been ended"); // This somehow never get printed. } } 

Você continua recebendo uma nova string e continua o loop se não estiver vazio. Basta inserir um controle no loop para uma string de saída.

 while(sc.hasNext() && !s1.equals("exit")) { // operate } 

Se você quiser declarar a string dentro do loop e não fazer as operações no corpo do loop se a string for “exit”:

 while(sc.hasNext()) { String s1 = sc.next(); if(s1.equals("exit")) { break; } //operate } 

O Scanner continuará a ler até encontrar uma condição de “fim do arquivo”.

Como você está lendo de stdin , isso será quando você enviar um caractere EOF (geralmente ^d no Unix), ou no final do arquivo se você usar o < style redirection.

Quando você usa o scanner, como mencionado por Alnitak, você só tem ‘false’ para hasNext () quando você tem um caractere EOF, basicamente … Você não pode facilmente enviar e caractere EOF usando o teclado, portanto, em situações como esta, é comum para ter um caractere especial ou palavra que você pode enviar para interromper a execução, por exemplo:

 String s1 = sc.next(); if (s1.equals("exit")) { break; } 

Pausa vai tirar você do loop.

Sua condição está correta (embora você deva soltar o == true ). O que está acontecendo é que o scanner continuará até atingir o final da input. Tente Ctrl + D ou canalize a input de um arquivo ( java myclass < input.txt ).

não funciona porque você não programou uma falha de segurança no código. java vê que o scanner ainda pode coletar input enquanto há input a ser coletada e, se possível, enquanto isso é verdade, ela continua fazendo isso. ter um teste de scanner para ver se uma determinada palavra, como EXIT, por exemplo, é boa, mas você também pode tê-lo em loop um certo número de vezes, como dez ou mais. mas a abordagem mais eficiente é perguntar ao usuário do seu programa quantas strings ele deseja inserir, e enquanto o número de strings que ele digita é menor do que o número que ele insere, o programa deve ser executado. uma opção adicional poderia ser se eles digitam EXIT, quando eles vêem que precisam de menos espaços do que eles colocam e não querem preencher as próximas células com nada além de espaços em branco. e você pode fazer com que o programa pergunte se eles querem inserir mais informações, caso percebam que precisam inserir mais dados no computador. o programa seria bastante simplista, porque há uma maneira de fazer isso. sinta-se à vontade para me perguntar por esses caminhos, mas estou ficando sem espaço. XD

Se você não quiser usar um caractere EOF para isso, você pode usar o StringTokenizer:

 import java.util.*; public class Test{ public static void main(){ Scanner sc = new Scanner (System.in); System.out.print("Enter your sentence: "); String s=sc.nextLine(); StringTokenizer st=new StringTokenizer(s," ");//" " is the delimiter here. while (st.hasMoreTokens() ) { String s1 = st.nextToken(); System.out.println(s1); } System.out.println("The loop has been ended"); } } 

Você pode simplesmente usar um dos indicadores de fim de arquivo dependentes do sistema (d para Unix / Linux / Ubuntu, z para windows) para tornar a declaração while falsa. Isso deve tirar você do circuito bem. 🙂

Modifique o loop while como abaixo. Declare s1 como String s1; uma vez fora do loop. Para finalizar o loop, simplesmente use ctrl + z.

  while (sc.hasNext()) { s1 = sc.next(); System.out.println(s1); System.out.print("Enter your sentence: "); }