You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多方法连续调用场景下Scanner关闭引发NoSuchElementException的解决方案咨询

解决Scanner关闭导致的NoSuchElementException及资源泄漏问题

问题根源

你遇到的问题核心在于:每次调用Scanner.close()时,不仅会关闭Scanner对象,还会连带关闭它底层依赖的System.in输入流。当第一个方法里的Scanner被关闭后,System.in就已经处于关闭状态了,第二个方法再创建新的Scanner去读取输入时,自然就会抛出NoSuchElementException——因为已经没有可用的输入流可以读取了。

而移除close()语句后,Scanner没有被正确关闭,所以IDE会提示资源泄漏警告。


正确的解决方案:共用一个Scanner实例

我们只需要创建一个Scanner对象,让所有需要读取输入的方法共用它,最后在程序结束前(也就是main方法的末尾)统一关闭这个Scanner即可。这样既不会提前关闭System.in,也能正确释放资源,消除警告。

修改后的代码如下:

import java.util.Scanner;

public class CurrencyConverter {
    static double money;
    static double xr;
    // 定义一个静态的Scanner实例,供所有方法共用
    static Scanner keyboard = new Scanner(System.in);

    public static void main(String[] args) {
        try {
            requestAmount();
            requestRate();
            displayResult();
        } finally {
            // 程序结束前统一关闭Scanner,释放资源
            keyboard.close();
        }
    }

    public static void requestAmount() {
        System.out.println("Please enter quantity of money to be exchanged:");
        money = keyboard.nextDouble();
    }

    public static void requestRate() {
        System.out.println("Please enter exchange rate:");
        xr = keyboard.nextDouble();
    }

    public static double conversionCalculator(double moneyIn, double xrIn) {
        return moneyIn * xrIn;
    }

    public static void displayResult() {
        System.out.println("Amount of currency post-conversion = " + conversionCalculator(money, xr));
    }
}

补充说明

  1. 使用try-finally块是为了确保即使程序中途出现异常,Scanner也能被正确关闭。
  2. 如果你更倾向于符合面向对象的设计原则,也可以选择把Scanner作为参数传递给各个方法,而不是用静态成员,示例如下:
public static void main(String[] args) {
    Scanner keyboard = new Scanner(System.in);
    try {
        requestAmount(keyboard);
        requestRate(keyboard);
        displayResult();
    } finally {
        keyboard.close();
    }
}

public static void requestAmount(Scanner keyboard) {
    System.out.println("Please enter quantity of money to be exchanged:");
    money = keyboard.nextDouble();
}

两种方式都能完美解决问题,你可以根据自己的习惯选择。

内容的提问来源于stack exchange,提问作者user19580548

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:33:10