Java实现图形面积计算菜单时出现NoSuchElementException异常
平面图形面积计算Java程序的
NoSuchElementException问题定位与修复 异常根因
- 代码存在典型的标准输入流使用反模式:在多个方法中反复新建绑定
System.in的Scanner实例,且通过try-with-resources自动执行Scanner的关闭操作。 - 根据Java类库实现,
Scanner.close()方法会级联关闭其所绑定的底层输入流。当任意一个面积计算方法的try块执行结束,对应的Scanner会被自动关闭,直接把全局共享的System.in标准输入流永久切断。 - 标准输入流被关闭后,后续新建的Scanner实例即使成功绑定
System.in,也会直接识别到流已到末尾,在调用nextLine()读取内容时立刻抛出NoSuchElementException: No line found,与错误栈的表现完全匹配。
两类场景都会触发当前报错:
- 若运行环境无交互式输入通道、或程序启动后立刻触发输入流EOF(比如无交互的命令行运行场景、运行配置将输入源重定向为空文件),首次调用
nextLine()读取菜单选择时就会直接抛出异常,对应启动即报错的表现;- 即使运行环境正常,用户完成一次面积计算操作、返回菜单界面后,也会因为
System.in被之前的Scanner关闭,触发完全相同的异常。
修复步骤
- 全局复用唯一Scanner实例:在Menu类中定义静态的全局Scanner对象,绑定
System.in,所有输入读取操作全部复用该实例,全程绝对不要调用这个Scanner的close()方法,避免切断标准输入流。 - 移除多余的Scanner创建逻辑:删除所有面积计算方法内部新建Scanner的代码,全部替换为复用全局Scanner读取输入。
- 处理输入缓冲区残留:使用
nextDouble()等非行读取方法读取数值后,主动调用一次nextLine()消化输入缓冲区遗留的换行符,避免后续读取出现空行错位。 - 校验运行环境配置:检查IDE的运行配置,确认未将输入源重定向到空文件,保留交互式输入通道。
关键代码调整示例
- 类定义部分新增全局复用的Scanner实例:
public class Menu { // 全局唯一Scanner,绑定标准输入,全程不主动关闭 private static final Scanner globalScanner = new Scanner(System.in); boolean exit; public static void main(String[] args) { Menu menu = new Menu(); menu.runMenu(); } // 其余原有方法结构保持不变 }
getInput()方法替换内部的Scanner创建逻辑,直接复用全局实例:
private int getInput() { int choice = -1; do { System.out.println(" "); System.out.println("Enter your choice: "); try { // 直接用全局Scanner读取输入行 choice = Integer.parseInt(globalScanner.nextLine()); } catch (NumberFormatException e) { System.out.println("Invalid Selection. Please try again."); } } while (choice < 0 || choice > 4); return choice; }
- 面积计算方法移除内部的try-with-resources Scanner逻辑,以正方形面积计算为例,其余图形的计算方法同理调整:
private void areaofSquare() { System.out.println("+----------------------------+"); System.out.println("| **Area of the Square** |"); System.out.println("+----------------------------+"); System.out.println(" "); System.out.println("Enter Side of Square: "); double side = globalScanner.nextDouble(); // 消化输入缓冲区的换行残留 globalScanner.nextLine(); double area = side * side; System.out.println("Area of Square is: " + area); }
内容的提问来源于stack exchange,提问作者XSS
相关产品推荐
相关产品推荐

