Java:使用Scanner时总是收到NoSuchElementException

时间:2012-10-06 11:51:38

标签: java exception java.util.scanner

我有这个简单的代码:

    public class Example {
       public Example() {
          Scanner scanner = new Scanner(System.in);
          int row = scanner.nextInt();   // exception at this line
          scanner.close();
       }

    public static void main(String[] args) {
        Example ex1 = new Example();   // this line successfully operate
        Example ex2 = new Example();   // exception : no such element exception at above line
    }
  }

当代码运行到ex2时,我不知道为什么总是会收到此异常。

2 个答案:

答案 0 :(得分:4)

你应该在调用scanner.nextInt()之前添加if(Scanner.hasNext()); 你有例外,因为没有找到int。

答案 1 :(得分:4)

问题是因为你关闭了Scanner,后者又关闭了基础InputStream(在这种情况下是stdin)。当您尝试再次使用stdin时,Scanner无法检索任何数据,因为stdin已关闭。

如果直接从commandlne运行,那么提供stdin访问权的正确方法是使用Console类。控制台类提供了一个包含stdin的Reader,它具有no-op close方法。例如

public class Example {
   public Example() {
      Scanner scanner = new Scanner(System.console().reader()); 
      // note change on above line
      int row = scanner.nextInt();
      scanner.close();
   }
}

注意,如果您通过Console类访问stdin,那么您可能会自己造成问题。如果您直接从命令行调用您的java程序,那么您将无法访问控制台。例如,以下将会引发问题。

echo 2 3 | java Example

Process p = new ProcessBuilder("java", "Example").start();
// write data to process