1

次のコードで実行時エラーが発生するのはなぜですか? NoSuchElementExceptionメソッドが2回目に呼び出されたときに私に与えます。への呼び出しを削除すると正常に動作しますstdin.close()が、Eclipse はリソースが閉じられていないという警告を出します。

コード:

import java.util.Scanner;


public class st {
  public static void main(String[] args) {
    System.out.println("First call");
    getInt("Enter first int (1-10): ");
    System.out.println("Second call");
    getInt("Enter second int (1-10): ");
  }

  /**
   * Reads an integer number from the keyboard.
   *
   * @param  prompt    the string to display as a prompt.
   * @return           the integer number entered at the keyboard.
   */
  public static int getInt(String prompt) {
    Scanner stdin = new Scanner(System.in);

    System.out.print(prompt);
    int val = stdin.nextInt();

    stdin.close();
    return(val);
  }
}

// END

出力:

>java st
First call
Enter first int (1-10): 5
Second call
Enter second int (1-10): Exception in thread "main" java.util.NoSuchElementException
        at java.util.Scanner.throwFor(Unknown Source)
        at java.util.Scanner.next(Unknown Source)
        at java.util.Scanner.nextInt(Unknown Source)
        at java.util.Scanner.nextInt(Unknown Source)
        at st.getInt(st.java:24)
        at st.main(st.java:9)

>

バージョン:

>java -version
java version "1.7.0_21"
Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)

>

ありがとう

ブライアン

4

2 に答える 2

1

@MikePrecup が言うように、最初の Scanner ( stdin) を閉じると、 も閉じSystem.inているため、2 番目の Scanner は読み取れなくなり、 aNoSuchElementExceptionがスローされます。

ただし、別のオプションをお勧めします。クラス変数として宣言する単一のスキャナーを使用します。

public class st {

  private static Scanner stdin = new Scanner(System.in);

  public static void main(String[] args) {
    System.out.println("First call");
    getInt("Enter first int (1-10): ");
    System.out.println("Second call");
    getInt("Enter second int (1-10): ");
  }

  /**
   * Reads an integer number from the keyboard.
   *
   * @param  prompt    the string to display as a prompt.
   * @return           the integer number entered at the keyboard.
   */
  public static int getInt(String prompt) {
    System.out.print(prompt);
    int val = stdin.nextInt();

    stdin.close();
    return(val);
  }
}

// END
于 2013-06-23T01:51:54.553 に答える