如何在java中使用Scanner方法“hasNext”作为条件退出while循环?
我是一个初学java编程,并遇到了一个奇怪的问题。 下面是我的代码,它要求用户input并打印出用户每次input一个单词的内容。
问题是程序永远不会结束,而且从我的有限理解来看,它似乎陷入了while循环内部。 任何人都可以帮我一下吗? 提前致谢。
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. } }
你继续得到一个新的string,并继续循环,如果它不是空的。 只需在循环中插入一个控制string即可。
while(sc.hasNext() && !s1.equals("exit")) { // operate }
如果你想在循环中声明string,而不是在循环体中进行操作,如果string是“exit”:
while(sc.hasNext()) { String s1 = sc.next(); if(s1.equals("exit")) { break; } //operate }
Scanner
将继续读取,直到find“文件结束”状态。
当你从stdin
读取数据时,要么是发送EOF字符(通常在Unix上是^d
),要么是使用<
样式redirect的文件末尾。
当你使用扫描器时,正如Alnitak所提到的,当你有一个EOF字符时,你只会得到'hasNext()',基本上…你不能用键盘轻松发送和EOF字符,所以在这种情况下,有一个特殊的字符或单词,你可以发送停止执行,例如:
String s1 = sc.next(); if (s1.equals("exit")) { break; }
rest会让你走出循环。
它不起作用,因为你没有编写一个故障安全的代码。 java看到扫描器仍然可以在收集input的同时收集input,如果可能的话,这是事实,但它仍然如此。 有一个扫描仪testing,看看是否一个特定的单词,如EXIT,是好的,但你也可以让它循环一定的次数,如十左右。 但最有效的方法是询问程序的用户有多less个string,当input的string数less于他们input的string数时,程序将执行。 如果他们inputEXIT,当他们看到他们需要的空间比他们放入的空间less,并且不希望只用空白填充下一个单元格时,可以添加一个选项。 你可以让程序询问他们是否要input更多的input,以防他们意识到他们需要input更多的数据到计算机中。 该程序将是相当简单的,以及因为有一种方法,你可以做到这一点plethera。 随意问我这些方法,我虽然没有空间。 XD
如果你不想为此使用EOF字符,你可以使用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"); } }
你的条件是正确的(尽pipe你应该放弃== true
)。 正在发生的事情是,扫描仪将继续前进,直到到达input的末尾。 试试Ctrl + D ,或从一个文件( java myclass < input.txt
)pipe道input。
您可以简单地使用系统相关的文件结束指示符(d用于Unix / Linux / Ubuntu,z用于windows),以使while语句为false。 这应该让你很好地离开循环。 🙂
修改while循环如下。 将s1声明为String s1; 一次在循环之外。 要结束循环,只需使用Ctrl + Z。
while (sc.hasNext()) { s1 = sc.next(); System.out.println(s1); System.out.print("Enter your sentence: "); }