扫描器next()为某些在线编译器抛出NoSuchElementException

时间:2016-09-29 09:26:34

标签: java

这似乎是一个常见问题(多次询问),但我无法找到此行为的解释。以下代码在一个编译器中工作,但在另一个编译器中抛出Exception in thread "main" java.util.NoSuchElementException

  Scanner s = new Scanner(System.in);
  System.out.println("Enter name: ");
  String name = s.next();
  System.out.println("Name is " + name);

https://www.compilejava.net/https://www.codechef.com/ide上测试它会引发异常。但是,在一些编译器上它工作正常。这种行为是否有任何原因(比如JDK中的更改或其他内容)?

3 个答案:

答案 0 :(得分:5)

抛出此异常是因为枚举中没有其他元素。

请参阅the documentation

  

由Enumeration的nextElement方法抛出以指示   枚举中没有更多元素。

某些在线IDE根本不允许用户输入,在这种情况下,只要您尝试读取用户输入,就会抛出异常。

  1. 适用于TutorialsPoint IDE,因为它允许用户输入。
  2. 它不适用于codechefcompilejava IDE,因为这些IDE不支持用户输入。
  3. 然而,在codechef上添加用户输入的第二种方法。只需在Custom Input复选框上勾选标记并提供任何输入。然后它将编译。

    此异常的另一个原因,即根本没有更多的用户输入,可以在调用s.next()之前处理,只需检查s.hasNext()以查看扫描程序是否有另一个令牌。

      Scanner s = new Scanner(System.in);
      System.out.print("Enter name: ");
      String name = null;
      if(s.hasNext())
          name = s.next();
      System.out.println("Name is " + name);
    

答案 1 :(得分:1)

根据rD。回答问题的另一个解决方案是捕获异常:

Scanner s = new Scanner(System.in);
System.out.print("Enter name: ");
String name = "";
try {
    name = s.next();
    System.out.println("Name is " + name);
} catch (NoSuchElementException e) {
    System.out.println("You have to enter a name");
}

答案 2 :(得分:1)

在在线IDE上工作时,您应该在指定区域输入您的输入。正如您所给出的示例codechef具有输入的额外字段(即自定义输入)。但是,某些在线IDE不像第一个链接IDE那样支持自定义输入。他们给出错误。 (即java.util.NoSuchElementException

enter image description here