Scanner中的hasNext()方法用作while()的条件判断时,会导致程序不能跳出循环,下面通过两种情况进行说明。
一
结合System.in创建Scanner对象。
代码
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = 0;
while (scanner.hasNext()) {
System.out.println("有下一个,下一个是:");
a= scanner.nextInt();
System.out.println(a);
}
System.out.println("到尾!没有下一个");
}
}
截图
绿色的1 2 3 4是输入。仔细观察可以发现,程序最终没有结束,scanner还在等待用户的输入,这是因为hasNext()方法会一直寻找下一个标记(token,就是有效匹配项)直到Scanner对象被colse()方法关闭(显然,上面程序没有合适的关闭位置),否则hasNext()宁愿挂起程序等待用户输入也不跳出循环。
二
不使用System.in,创建定长Scanner对象
代码
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner("1 2 3 4");
int a = 0;
while (scanner.hasNext()) {
System.out.println("有下一个,下一个是:");
a= scanner.nextInt();
System.out.println(a);
}
System.out.println("到尾!没有下一个");
}
}
截图
可以看到此时scanner读取完最后一个整数4之后退出while()循环,结束程序。这是由于程序中的Scanner对象中的字符串是定长的(在初始化时就确定),执行到最后一个元素4后再次判断hasNext()==false,这样就跳出循环,紧接着结束程序。
通过以上两种情况可以知道在while(hasNext())组合时,使用System.in(也就是控制台输入)会导致程序无法跳出循环(没有使用close()关闭Scanner对象)。而其他定长的Scanner对象则不存在这个问题。