3

我有这个简单的代码:

    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 时我总是收到此异常。

4

2 回答 2

4

你应该在调用scanner.nextInt()之前添加if(Scanner.hasNext()); 您有例外,因为没有发现要读取的 int 。

于 2012-10-06T12:00:16.887 回答
4

问题是因为您关闭了Scannerwhich 又关闭了底层InputStream(在本例中为标准输入)。当您再次尝试使用标准输入时,Scanner由于标准输入已关闭,因此无法检索任何数据。

如果直接从命令行运行,那么提供对标准输入的访问的正确方法是使用Console该类。控制台类提供了一个包装在 stdin 周围的 Reader,它有一个无操作关闭方法。例如。

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

请注意,如果您不是通过 Console 类访问标准输入,那么您可能会给自己带来问题。如果您不是直接从命令行调用 java 程序,那么您将无法访问控制台。例如,以下将调用会导致问题。

echo 2 3 | java Example

或者

Process p = new ProcessBuilder("java", "Example").start();
// write data to process
于 2012-10-07T08:26:30.990 回答