为什么我得到此代码的 NoSuchElementException?Java 方法,为用户提供第二次正确输入的机会

Why am I getting NoSuchElementException for this code? Java method for giving users a second chance for correct input

提问人:giotto1 提问时间:3/24/2022 最后编辑:giotto1 更新时间:3/24/2022 访问量:54

问:

我正在编写一个程序,我的代码遇到了一些问题。我调用了一个调用的方法,该方法为用户提供了第二次输入有效输入的机会。该方法定义如下:secondChance()

    Scanner input2 = new Scanner(System.in);
    StringBuilder html = new StringBuilder();
    String val;

 try {
      System.out.println("Please enter file name you would like to view (include .csv at the end):");
      String fileName = input2.nextLine(); //LINE 191

      if (!(fileName.equals("doctorList.csv"))) {
        input2.close();
        throw new FileNotFoundException();
      } else {

        BufferedReader br = new BufferedReader(new FileReader(file2));
        while ((val = br.readLine()) != null) {
          html.append(val);
        }
        br.close();
        input2.close();
        String output = html.toString();
        System.out.println(output);
      }
    } catch (FileNotFoundException e) {
      System.out.println("Invalid file input. Terminating program.");
      System.exit(0);
    } catch (IOException e) {
      System.out.println("Error occured. Terminating program.");
      input2.close();
      System.exit(0);
    }

  }

我得到的输出/错误是:

Please enter file name you would like to view (include .csv at the end):
Exception in thread "main" java.util.NoSuchElementException: No line found
        at java.base/java.util.Scanner.nextLine(Scanner.java:1651)
        at CSV2HTML.secondChance(CSV2HTML.java:191)
        at CSV2HTML.main(CSV2HTML.java:68)

异常中的第 68 行是调用该方法的行。方法中用于询问用户输入的代码与 secondChance() 方法中显示的代码相同。作为参考,下面是调用 secondChance() 方法的代码:

} catch (FileNotFoundException e) {
      System.out.println("Invalid file input. Now initiating second chance.");
      secondChance(); //THIS IS LINE 68
    }

编辑:我在代码块的顶部添加了 input2,以显示它的初始化位置/方式。

异常 java.util.scanner nosuchElementException

评论

0赞 Stultuske 3/24/2022
什么是191号线?因为这是它被扔到你的代码中的地方
0赞 3/24/2022
什么是,在哪里被声明和启动?当您调用该 Scanner 对象时,我们无法真正告诉您出了什么问题,如果您通过不包含有关它的详细信息来将其保留为神秘对象。input2nextLine()
1赞 Nexevis 3/24/2022
除了@OH上帝蜘蛛说的,什么是和,你实际上并没有在这里的任何地方宣布它们。另外,如果打开,你不应该调用它。file2htmlinput2new Scanner(System.in).close()
0赞 giotto1 3/24/2022
@Stultuske第 191 行是:String fileName = input2.nextLine();(我在代码中添加了注释以显示它的位置,很抱歉造成混淆)
0赞 giotto1 3/24/2022
@OHGODSPIDERS我添加了代码,它就会在 secondChance() 方法中声明,就在 try 块之前。

答:

0赞 rzwitserloot 3/24/2022 #1

抛出该异常只有 2 种解释。从你写问题的方式来看,这里只有这两个中的一个是可行的:scanner.nextLine()

你 System.in!close()

System.in 是您的应用程序标准输入。假设您刚刚像往常一样启动应用程序,那将是“键盘”,实际上是无穷无尽的,因此通常不会发生异常。如果你以 ,你告诉操作系统用作“键盘”,这肯定会用完行,这是另一个不太可能的解释。(如果你真的以这种方式启动你的应用程序,那么这就是你的解释:扫描仪消耗了所有行。您的代码中可能存在一个错误,导致读取“太多”行,请使用调试器逐步执行)。java -jar yourapp.jar <somefile.txtsomefile.txt

但是,您可以关闭此资源,这意味着任何进一步尝试从 System.in 读取都将失败,就像您看到的那样。解决方案很简单:永远不要关闭 System.in

扫描程序是一个筛选器,如果关闭扫描程序,则扫描程序将关闭基础资源。因此,假设您有一个 System.in () 的扫描程序,则规则“do no close System.in”将扩展为:“...也永远不要关闭这些扫描仪”。new Scanner(System.in)

你要么写过:

scanner.close();

或者你写了:

try (Scanner s = new Scanner(System.in)) {
  // stuff with scanner here
}

当代码“走出”try 块时,该构造会调用 try 括号中事物的方法,而不管它如何走出(控制流,例如语句、抛出异常或只是跑到它的末尾)。close()return

某些 IDE 会注意到您正在使用标记为资源的类(甚至只是上述任何可以在 try-with 中使用的类),并会警告您应该使用 try-with。编辑器/棉绒工具是错误的,您必须忽略它。“哪些东西应该关闭或不关闭”的概念比这些简单的工具要复杂得多。这是您实际上不能关闭的资源之一。

摆脱它。删除/替换:scanner.close()

try (Scanner s = new Scanner(System.in)) {
  codeHere();
}

只需:

Scanner s = new Scanner(System.in);
codeHere();