Scanner input = new Scanner(System.in);
while(input.hasNext()){
System.out.println(input.nextInt());
System.out.println("To go on,Enter any number");
}
在这里,hasNext()
语句如何运行?任何人都可以详细解释它吗?
答案 0 :(得分:2)
hasNext()告诉您是否有更多元素要从流中读取。在这种情况下,调用将阻塞,直到有用户输入。
有三种情况:
用户根本不提供任何输入。通话将无限期阻止。
用户提供的输入不是EOF。返回值将是 真。
用户输入EOF。返回值将为false。
在程序的上下文中,这意味着while循环将被执行,直到用户提供EOF(Ctrl + D或Ctrl + Z)。如果用户意识到这一点,我想它会没事的。
但是这种行为肯定会变得更加用户友好:例如,它当前要求用户输入一个数字。但是hasNext()并不关心输入是否为数字,只要输入不是EOF,循环就会一直持续。
如果用户尝试通过命令行提供某些预定义输入,如果输入没有以EOF特意终止,程序将永远阻止,则可能出现另一个问题。语句不表示当没有更多输入要读取时程序将退出(当然,除非由EOF指定)。
答案 1 :(得分:1)
基于JavaDoc,hasNext()
:
在界面Iterator<String>
如果此扫描程序在其输入中有另一个标记,则返回true
。在等待输入扫描时,此方法可能会阻塞。扫描仪不会超过任何输入
如果此扫描仪已关闭,则会IllegalStateException
在您的代码中,hasNext()
用于检查在每次while
迭代完成后是否有更多元素要在您的iterateable集合中进行迭代。
答案 2 :(得分:1)
Scanner
类实现了一个类Iterator<String>
请参阅here
如果您的类实现了Iterator<T>
,那么它需要实现以下函数
如果迭代包含更多元素,则返回true。 (换句话说,如果next()返回一个元素而不是抛出异常,则返回true。)
特定于扫描程序,doc指定:
如果此扫描程序的输入中有另一个标记,则返回true。在等待输入扫描时,此方法可能会阻塞。扫描仪不会超过任何输入。
返回迭代中的下一个元素。
除去
从底层集合中移除此迭代器返回的最后一个元素(可选操作)。每次调用next()时,只能调用此方法一次。如果在迭代正在进行中以除调用此方法之外的任何方式修改基础集合,则未指定迭代器的行为。
来源:Iterator doc
答案 3 :(得分:0)
扫描程序会扫描您收到的所有用户输入。所以基本上正确的编码标准关注于你如何处理意外情况。所以hasNext()方法基本上检查当前位置之后的空格或断行,并检查之后存在的二进制值。如果存在则返回true,否则返回false。