4

コマンドを画面に出力し、ユーザーの入力をスキャンして、文字列として返す簡単なメソッドがあります。ユーザーの入力が無効な場合は、ユーザーに通知して再度尋ねます。このメソッドは完全に機能しましたが、インストラクターは常にリソースを閉じる必要があると述べたので、戻って close メソッドに追加したところ、ユーザー入力に関係なく、メソッドが呼び出されるたびに NoSuchElementException が発生するようになりました。これがコードです...

private String getUserString(String userCommand) {
    System.out.println(userCommand);
    Scanner scan = new Scanner(System.in);
    String userinput = scan.nextLine().trim();

    if (userinput.isEmpty()){
        System.out.println("Invalid choice");
        return getUserString(userCommand);
    }

    else {
        return userinput;
    }
}

例外は常に、userinput が scan.nextLine().trim() として開始される行を指します。 注* 各 return ステートメントの前の各行に scan.close() を追加しましたが、上記には含めませんでした。

4

1 に答える 1

4

閉じたときに閉じscanSystem.in、そこから読み直そうとすると、例外がスローされます。

インストラクターは1つの側面で正しいので、リソースをクリーンアップする必要がありますSystem.in


入力が必要になるたびにストリームを再度開く代わりに、Scanner一度作成して、入力が必要な場所で再利用することができます。

public static void main(String[] args) throws IOException {
    Scanner scan = new Scanner(System.in);
    System.out.println(getUserString("Write something:", scan));
    System.out.println(getUserString("Write something else:", scan));
}

private static String getUserString(String userCommand, Scanner scan) {

    System.out.println(userCommand);

    String userinput = scan.nextLine().trim();

    if (userinput.isEmpty()) {
        System.out.println("Invalid choice");
        return getUserString(userCommand, scan);
    } else {
        return userinput;
    }
}
于 2012-09-17T07:22:40.077 に答える