java Scanner hasNextInt() 不确定阻塞

windxiaan 2017-12-07 02:35:53
问题代码如下:

import java.util.Scanner;

public class Test {

public static void main(String[] args) {
Test test = new Test();
int fri = test.isOKInput("第一次输入1~9的数字:", 1, 9);
int sec = test.isOKInput("第二次输入1~9的数字:", 1, 9);
System.out.println("第一次:" + fri);
System.out.println("第二次:" + sec);
}

// 检测非法输入
public int isOKInput(String str, int fri, int last) {
// 创建文本扫描器
Scanner input = new Scanner(System.in);
// 循环结束符
boolean flag = false;
int index = 0;
do {
System.out.print(str);
if (!(input.hasNextInt() && (index=input.nextInt()) >= fri && index <= last)) {
input.nextLine();
System.out.println("输入错误,请重新输入!");
continue;
}
flag = true;
} while (!flag);
input.close();
return index;
}

}


运行结果如下:
第一次输入1~9的数字:1
第二次输入1~9的数字:Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Unknown Source)
at test.Test.isOKInput(Test.java:25)
at test.Test.main(Test.java:10)

注释掉29行input.close();
就可以了,运行结果如下:
第一次输入1~9的数字:1
第二次输入1~9的数字:2
第一次:1
第二次:2

为什么第二次调用isOKInput()方法,input.hasNextInt()就不阻塞,不等待键盘输入了。
而do-whlie循环中,input.hasNextInt()可以多次阻塞,等待键盘输入。
...全文
301 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
windxiaan 2017-12-07
  • 打赏
  • 举报
回复
受教了,我在 Scanner input = new Scanner(System.in); 后面加上 System.in.close(); ,出现了一样的错误。原来System.in是一个静态变量InputStream,第一次关闭了System.in,后面就无法在使用了。
  • 打赏
  • 举报
回复
虽然是两个对象,但是属于一个io流,你在第一次输入的时候,方法里调用了close()方法,关闭了。你如果想实现这个的话,再加个判断,输入特定符号的时候,再关闭io流

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧