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