谢谢!我理解这样做的原因,但我想我的问题的根源是,如果hasNext()没有检测到没有输入,它将如何在我的循环中运行.
它...不会.
想想看.电脑怎么能区分一个正在考虑打字的用户和一个已经完成的用户的区别呢?打开网络摄像头,做一些人工智能分析,看看用户looks是否觉得自己已经打字完成了?
System.in
,is not the keyboard.如果你从命令行启动一个设置为从键盘读取的Java应用程序,那么它是JVM进程的标准输入,至少是by default.它不必是:
java -jar myapp.jar </some/path/to/some/file.txt
现在System.in
人从该文件中读取.在这一过程中,无法通过键盘进行阅读.
java -jar myapp.jar </dev/barcodeScanner1
现在,假设你扫描条形码的任何时候,Java应用程序都会收到它,就像你输入了条形码的号码,然后按下‘Enter’1.
这取决于‘这一输入的来源’到‘结束’.当您到达文件的末尾时,文件结束.
A keyboard cannot possibly 'end'-因此,100 cannot possibly return 101.
空格
你在 comments 中谈到了"输入空格".
那你就不懂Scanner
了.你有一个很好的同伴;这可能是最被误解的事情.可以肯定的是,如果我们按照StackOverflow被淹没的问题的绝对数量来衡量的话.
Scanner
和键盘有关的是nothing.
Scanner只是接受任何来源的文本输入,并将其拆分成块.块被称为"令牌",而"令牌"由"分隔符之间的所有文本"定义.分隔符又由正则表达式定义,by default所使用的正则表达式是\s+
.如在中,任意数量的空格.
因此:
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
while (true) {
System.out.println("Token: ≥" + s.next()) + "≤");
}
}
如果运行该命令,并在命令行中输入:hello world!
,然后按Enter键并键入my name is Lajos
,您将看到:
Token: ≥hello≤
Token: ≥world!≤
Token: ≥my≤
Token: ≥name≤
Token: ≥is≤
Token: ≥Lajos≤
关于 scanner 的事情:它是not possible注册或以其他方式获得珠子,任何属于‘分隔符’的内容是什么.你不能问 scanner :有多少空格?
当你遇到空格时,你也不能问:请停止.不,空格只是将一个令牌与下一个令牌分开.对于 scanner 来说,按Enter键与按空格键和then Enter键之间的距离是no difference at all.这两个字符都是‘1个或更多个空格字符’,因此可以互换,而且由于这是关于分隔符,因此无法检测到.
您可能根本不想使用 scanner .System.in本身当然可以区分它.
解决方案1
通常的策略是在提示中提到一些表示"完成"的神奇单词.例如:
static void main(String[] args) throws Exception {
var s = new Scanner(System.in);
System.out.println("Welcome to the fruit stand! Enter the fruit you'd like to buy, one at a time:");
var basket = new ArrayList<String>();
while (true) {
System.out.print("Fruit (type 'DONE' when done): ");
String fruit = s.next();
if (fruit.equalsIgnoreCase("DONE")) break;
basket.add(fruit);
}
System.out.println("Here's your basket: " + basket);
}
解决方案2
沟渠 scanner .或者至少,抛弃所有与之相关的方法,只使用nextLine
,这会与它拥有的所有其他方法产生糟糕的交互作用--只 Select 一个(nextLine
,或者除了nextLine
之外的所有方法):
static void main(String[] args) throws Exception {
var s = new Scanner(System.in);
System.out.println("Welcome to the fruit stand! Enter the fruit you'd like to buy, one at a time:");
var basket = new ArrayList<String>();
while (true) {
System.out.print("Fruit (enter when done): ");
String fruit = s.nextLine();
if (fruit.isEmpty()) break;
basket.add(fruit);
}
System.out.println("Here's your basket: " + basket);
}
[1]在实践中,大多数条形码 scanner 的外观和行为都像键盘,并且没有这样的设备,因为它不存在于/dev
中/不能被输送到这样的过程中.但是,作为一个例子,它是有效的.