多方法连续调用场景下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)); } }
补充说明
- 使用
try-finally块是为了确保即使程序中途出现异常,Scanner也能被正确关闭。 - 如果你更倾向于符合面向对象的设计原则,也可以选择把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
相关产品推荐
相关产品推荐

