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

問題はScanner、基になるものInputStream(この場合は標準入力) を閉じると閉じてしまうためです。stdin を再度使用しようとすると、Scannerstdin が閉じられているため、データを取得できません。

コマンドラインから直接実行する場合、標準入力へのアクセスを提供する正しい方法は、Consoleクラスを使用することです。コンソール クラスは、no-op close メソッドを持つ 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 クラス以外で stdin にアクセスすると、問題が発生する可能性が高いことに注意してください。また、コマンド ラインから直接以外で Java プログラムを呼び出すと、コンソールにアクセスできなくなります。たとえば、次の呼び出しでは問題が発生します。

echo 2 3 | java Example

また

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