我是java编程的初学者,遇到了一个奇怪的问题。下面是我的代码,它要求用户输入并打印出用户一次输入一个单词的内容。
问题是程序永远不会结束,而且从我有限的理解,它似乎陷入了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.
}
}
答案 0 :(得分:17)
你继续获得一个新字符串并继续循环,如果它不是空的。只需在循环中插入一个控件,即退出字符串。
while(!s1.equals("exit") && sc.hasNext()) {
// operate
}
如果你想在循环中声明字符串而不是在循环体中执行操作,如果字符串是“exit”:
while(sc.hasNext()) {
String s1 = sc.next();
if(s1.equals("exit")) {
break;
}
//operate
}
答案 1 :(得分:8)
Scanner
将继续读取,直到找到“文件结束”状态。
当你从stdin
读取时,那就是你发送一个EOF字符(通常是Unix上的^d
),或者当你使用{{1样式重定向。
答案 2 :(得分:4)
当你使用扫描仪时,正如Alnitak所提到的,当你有一个EOF角色时,你只能得到'false'的hasNext(),基本上......你不能轻易使用键盘发送和EOF角色,因此在这种情况下,通常有一个特殊的字符或单词可以发送以停止执行,例如:
String s1 = sc.next();
if (s1.equals("exit")) {
break;
}
休息会让你离开循环。
答案 3 :(得分:1)
你的情况是对的(尽管你应该放弃== true
)。发生的事情是扫描仪将继续运行,直到它到达输入的末尾。尝试 Ctrl + D ,或管道文件(java myclass < input.txt
)的输入。
答案 4 :(得分:1)
它不起作用,因为您没有在代码中编写故障安全程序。 java看到扫描程序仍然可以收集输入,同时有收集的输入,如果可能的话,虽然这是真的,但它仍然这样做。有一个扫描仪测试,以查看某个单词,例如EXIT是否正常,但你也可以让它循环一定次数,如十个左右。但最有效的方法是向程序的用户询问他们希望输入多少个字符串,并且当他们输入的字符串数量少于他们输入的数字时,程序将执行。一个附加的选项可能是,如果他们输入EXIT,当他们看到他们需要的空间少于他们输入的空间,并且不想用空白填充下一个单元格。并且您可以让程序询问是否要输入更多输入,以防他们意识到需要在计算机中输入更多数据。 这个程序非常简单,因为有一些方法可以做到。我可以随意问我这些方法,但是我已经没空了。 XD
答案 5 :(得分:1)
如果您不想为此使用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");
}
}
答案 6 :(得分:0)
您可以简单地使用系统相关的文件结束指示符之一(d代表Unix / Linux / Ubuntu,z代表Windows)使while语句为false。这应该让你很好地摆脱循环。 :)
答案 7 :(得分:0)
我遇到了同样的问题,我通过使用一个扫描程序对象从控制台读取整行,然后使用第二个扫描程序对象解析结果字符串来解决了这个问题。
Scanner console = new Scanner(System.in);
System.out.println("Enter input here:");
String inputLine = console.nextLine();
Scanner input = new Scanner(inputLine);
List<String> arg = new ArrayList<>();
while (input.hasNext()) {
arg.add(input.next().toLowerCase());
}
答案 8 :(得分:-3)
修改while循环,如下所示。将s1声明为String s1;一次在循环之外。要结束循环,只需使用ctrl + z。
while (sc.hasNext())
{
s1 = sc.next();
System.out.println(s1);
System.out.print("Enter your sentence: ");
}