You need to enable JavaScript to run this app. Java实现图形面积计算菜单时出现NoSuchElementException异常
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.13 18:36:04