我在使用java的Scanner类时遇到了麻烦。我可以让它读取我的输入就好了,但问题是当我想输出一些东西时。给定多行输入,我想在完全读取所有输入时打印一行。这是我用来读取输入的代码:
public static void main(String[] args){
Scanner scanner = new Scanner(System.in); //scanner reads block of input
while(scanner.hasNextLine()){
//body of loop goes here
String s = scanner.nextLine();
Scanner ls = new Scanner(s); //scanner to parse a line of input
while(ls.hasNext()){
//body of nested loop goes here
ls.next();
}
}
System.out.println("Fin");
}
即使已读取所有输入行,程序也不会到达System.out.println消息。 (注意,消息不能转到其他任何地方,否则它将输出循环运行的次数)。我该如何解决?任何帮助将不胜感激。
答案 0 :(得分:1)
正如我在外部while循环中看到的那样,你已经使用了
scanner.hasNextLine();
方法。如果必须等待输入,则此方法被阻止。你也有
Scanner scanner = new Scanner(System.in);
语句。因此system.in将一直等待输入,因此hasNextLine()方法必须等待输入。 这就是为什么控件卡在循环中而无法继续进行。
要修复它,您可以先将输入存储在字符串变量中,然后调用扫描程序构造函数。
答案 1 :(得分:0)
在这种情况下,您正在阅读无限流。如果此扫描仪的输入中有另一行,hasNextLine()
将继续返回true。由于它是System.in
,它将继续从键盘读取,除非您终止它或告诉流停止。
最后按“ctrl + Z”,你会发现它有效。
修改:你可以做这样的事情......
Scanner scanner = new Scanner(System.in); //scanner reads block of input
int BLOCK_SIZE =3,count=1;
while(scanner.hasNextLine()){
//body of loop goes here
String s = scanner.nextLine();
Scanner ls = new Scanner(s); //scanner to parse a line of input
while(ls.hasNext()){
//body of nested loop goes here
ls.next();
}
if(count++==BLOCK_SIZE)
{
break;
}
}
System.out.println("Fin");
}
答案 2 :(得分:0)
您需要告诉程序将不再有输入。这是通过附加EOF字符来完成的。这可以通过在控制台中按Ctrl-D在Linux上手动完成。我认为在Windows上你可以按Ctrl-Z。如果您将输入从一个程序输送到另一个程序,则流将自动关闭。
例如
cat filename | java MyJavaProgram
答案 3 :(得分:0)
的魔力
Scanner scanner = new Scanner(System.in);
while(scanner.hasNextLine()){
是否永远不会停止从系统输入(除非你用ctrl + d(对于mac)关闭输入)。
为了停止循环,我建议在条件中抛出更多东西而不仅仅是hasNextLine()。
E.g。
Scanner scanner = new Scanner(System.in); //scanner reads block of input
int BLOCK_SIZE =3,count=1;
while(scanner.hasNextLine() && count++ <= BLOCK_SIZE){ //<- Use count here.
//body of loop goes here
String s = scanner.nextLine();
Scanner ls = new Scanner(s); //scanner to parse a line of input
while(ls.hasNext()){
//body of nested loop goes here
ls.next();
}
}
System.out.println("Fin");
}