Java Scanner找不到行,然后Scanner关闭错误?

我有Java代码要求用户输入,然后将这些数据存储在字符串变量中。 下面的函数是一个名为’number’的类的一部分,在main函数中调用。

public static void setVal(int i){ Scanner readIn = new Scanner(System.in); //while (readIn.hasNextLine()){ str = readIn.nextLine(); numCheck = false; if (i == 1){ while (!numCheck){ if (str.contains(" ")){ System.out.println("Please input a single item."); str = readIn.nextLine(); } else if (!isNumeric(str)){ System.out.println("Please input a valid number."); str = readIn.nextLine(); } else { numCheck = true; value = Double.parseDouble(str); readIn.close(); } } readIn.close(); } else if (i == 2){ while (!numCheck){ if (str.contains(" ")){ System.out.println("Please input a single item."); str = readIn.nextLine(); } else if (!isNumeric(str)){ System.out.println("Please input a valid number."); str = readIn.nextLine(); } else { numCheck = true; secondV = Double.parseDouble(str); readIn.close(); } } readIn.close(); } else { System.out.println("An error has occurred."); } // } readIn.close(); } 

部分主要function如下所示:

  number input = new number(); for (int i = 1; i <= 2; i++){ input.setVal(i); System.out.println("Now please input a second value for computing with the first."); input.setVal(i); } 

我使用相同的函数两次,但交给它一个不同的参数来区分输入到一个不同的变量,但是当它第二次运行它会抛出一个no line found错误。

应用其他一些建议,你可以看到注释掉了我在执行代码之前添加了一个’hasNextLine()’检查以检查该行是否存在但是这最终导致’扫描仪已关闭’错误,即使我每次都调用一个新的Scanner实例该function运行的时间。 我还适当地关闭了扫描仪以确保最小化错误。

我不知道出了什么问题因为我可以在main函数中创建一个Scanner并且在没有错误的情况下多次调用’.nextLine()’但是当通过类方法再次调用时,我会收到这些错误。

任何帮助表示赞赏,提前谢谢。

Scanner.close()文档说明了这一点

如果此扫描程序尚未关闭,那么如果其底层可读也实现了Closeable接口,则将调用可读的close方法。 如果此扫描仪已关闭,则调用此方法将不起作用。

在关闭扫描程序时,您还关闭了System.in输入流,因此当您重新打开扫描程序时,它将找不到任何打开的输入流。

参考: java.util.NoSuchElementException – 扫描程序读取用户输入

最好将外部方法中的scanner对象作为参数传递,然后只有在完成后才能在调用方法中将其关闭。


只是要指出,你的String对象是str吗? 如果没有,那么你不能在静态方法中使用它。 最好从方法声明中删除静态。

一切都完成后你必须关闭扫描仪。

您已在流中关闭扫描程序readIn.close(); 两次。

您在从文件中逐行选择之前关闭流。 因此,在使用readIn的所有实例完成后,您必须关闭它一次。