当前位置: 首页 > 知识库问答 >
问题:

NoSuchElementException在方法中重新打开扫描仪

阎嘉荣
2023-03-14

下面是抛出异常的代码的简化版本。

static String s1;
static String s2;

static void getString(String s) {
    Scanner sc = new Scanner(System.in);
    s = sc.nextLine();
    sc.close();
}

public static void main(String[] args) {
    getString(s1);
    getString(s2);
}

线程“main”java.util出现异常。NoSuchElementException:在temp.temp.getString(temp.java:13)的java.util.Scanner.nextLine(Scanner.java:1540)中找不到行

我两次调用getString方法,在第二次调用时它会中断:

s = sc.nextLine();

现在,我明白删除sc.close()行可以解决问题(并且可能也使sc成为静态变量)。我需要理解的是为什么会这样。

我阅读了扫描仪类的规范,但无法推断。我还阅读了几篇关于此异常的帖子,包括这篇,其中说关闭扫描仪也会关闭底层流。但是我正在创建一个新的扫描仪,并在每次方法调用时重新打开流,不是吗?

共有2个答案

瞿博易
2023-03-14

您不能“重新打开”System.in、System.out或System.err

作为对此的另一个解决方案,您可以使用CloseShieldInputStream,如下所述

华烈
2023-03-14

没有所谓的“重开一条流”。您唯一能做的就是用一个新的< code>Scanner创建一个新的流,并有选择地将它放在同一个变量中。

一旦你关闭了sc,你也关闭了底层System.in流。在它上面创建一个新的扫描仪不能“重新打开”它,因为流已经关闭,所以你会得到这个异常。

长话短说——虽然在使用完资源后关闭它们绝对是一个很好的做法,但您不应该关闭System.in(或任何基于它的扫描仪)。

 类似资料:
  • 问题内容: 我的Java作业有问题。我遇到了意外的异常,特别是: java.util.NoSuchElementException:找不到行 我正在使用,该程序不断读取任何内容,并重复“无效格式”异常文本。如果输入正确的值,则第一部分通过,然后该部分立即进入此异常。如果输入的值不正确,则它将开始循环异常。 这是我的代码: 问题答案: 您关闭了多个库,这些库关闭了底层库,因此另一个库将不再从同一库和

  • 问题内容: 我真的试图通过线程找到答案,但仍然希望能得到一些反馈。 我认为下面的代码风格不好,但是我不知道为什么在输入数字后会把我射杀 ,因为我为两个方法创建了两个Scanner对象,并且我应该能够开始一个新的输入。而且,如果我删除了inputAndPrintNumber()中的内容,它将正常工作并正确编译。我真的希望知道如果我仍然使用两个Scanner obj并且不删除(如果可能的话)为什么以及

  • 问题内容: 在Java中,出现此异常: 从此Java代码: 抛出异常 System.out.println(file.next()。charAt(counter)); 异常是什么意思? 问题答案: 您在循环的每次迭代中都调用两次,因此,当您快要结束时,您会跳出列表的末尾,编译器会告诉您那里什么也没有。 代替这个: 改为这样做: 看这里

  • 下面的代码显示了一个错误。我对编码很陌生。这东西弄乱了我的脑袋。我能做什么? 下面的代码在编辑之后。但它仍然显示出NoSuchElementFound异常的相同错误。

  • 问题内容: 在一个类中,我有两种使用扫描器类的不同方法。我为第一个方法创建了一个扫描程序对象的新实例,然后在第一个方法的结尾将其关闭…然后在第二个方法中创建了一个对象(具有不同名称)的新实例,最后在此方法的结尾。 除非我打开扫描仪一次,然后关闭扫描仪,否则它将无法工作并返回错误。扫描器类的双重用途似乎不起作用。我究竟做错了什么? 这是我的两种返回错误的方法… 问题答案: 您应该将Scanner声明

  • 问题内容: 逻辑工作正常,但是,当while循环结束并重新开始时,使用此行从键盘再次读取我的下一个选项-> option = kb.nextInt(); 。它给了我一个例外,更确切地说是下面的一个例外: 下面是我的代码,为什么此扫描程序会生成此错误?还有其他从键盘读取的方法吗? 下面的此方法在另一个类文件RegistrationController.java上,因此由上面的rc viariable