在java.util.Scanner.throwFor(未知来源)错误
private static int posNum() { Scanner scan = new Scanner(System.in); int input = 0; boolean error; if (scan.hasNextInt()) { input = scan.nextInt(); error = input <= 0; } else { 28 scan.next(); error = true; } while (error) { System.out.print("Invalid input. Please reenter: "); if (scan.hasNextInt()) { input = scan.nextInt(); error = input <= 0; } else { scan.next(); error = true; } } scan.close(); return input; }
所以我第二次调用这个方法时返回以下错误。
Exception in thread "main" java.util.NoSuchElementException at java.util.Scanner.throwFor(Unknown Source) at java.util.Scanner.next(Unknown Source) at q2.CylinderStats.posNum(CylinderStats.java:28) at q2.CylinderStats.main(CylinderStats.java:62)
第一个调用是rad = posNum();
运行正常,然后secondis height = posNum();
在进入错误之前不允许输入值。
谢谢
在next
打电话时,你应检查扫描仪是否有一个。
if(scan.hasNext()) scan.next();
根据Scanner#next的 java doc
NoSuchElementException如果没有更多令牌可用
你可以改变你的方法,如下所示
private static int posNum(Scanner scan) { int input = 0; boolean error = false; if (scan.hasNext()) { if (scan.hasNextInt()) { input = scan.nextInt(); error = input <= 0; } else { scan.next(); error = true; } } while (error) { System.out.print("Invalid input. Please reenter: "); if (scan.hasNextInt()) { input = scan.nextInt(); error = input <= 0; } else { if (scan.hasNext()) scan.next(); error = true; } } return input; }
然后像下面这样调用它
Scanner scan = new Scanner(System.in); int i = posNum(scan); System.out.println(i); int j = posNum(scan); System.out.println(j);
它运行一次并给你带来麻烦的事实意味着它无法从流中读取任何内容。
来自Java DOC:
当扫描仪关闭时,如果源实现了Closeable接口,它将关闭其输入源。
这意味着它关闭了System.in
因此,打开扫描仪将第二次防止错误。
删除scan.close();
你的程序应该正常工作!
- 即使没有指定@Load,Objectify也会在Ref 后面加载对象
- 如何使用Android对Firestore进行分页?
- 如何使用Java发送Google地方信息搜索请求
- 如何使用Android在RecyclerView中显示Firestore中的数据?
- java.lang.IllegalStateException:您需要在此活动中使用Theme.AppCompat主题(或后代)
- Android信号分析+一些filter
- 应该在Java中避免自动装箱
- 自动化测试错误:org.openqa.selenium.WebDriverException:disconnected:无法连接到渲染器
- App Engine灵活环境Java servlet获取太多/ _ah / health请求