5

誰もこれに問題があると思いますか? 最初の入力は正常に機能しますが、最初のループの後、値の再入力を求められません。これを修正するにはどうすればよいですか?

    int value;
    while(true)
    {
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter a value");
        try 
        {
            value = scan.nextInt();
            System.out.println("value provided is: " + value);
            scan.nextLine(); // consumes "\n" character in buffer
        }
        catch(InputMismatchException e) // outputs error message if value provided is not an integer
        {
            System.out.println("Incorrect input type. Try again.");
            continue; // restarts while loop to allow for re-entering of a valid input
        }
        scan.close();
    }
4

3 に答える 3

5

ループscan.close();の外に移動します。while

また、反復ごとに新しい ものを作成する必要はありません。Scanner宣言もループ外に移動してください。


Scannerの場合close、これは入力ストリームを閉じます。System.in

したがって、再度インスタンス化しようとすると、開いているストリームが見つからず、その例外が発生します。

于 2013-12-23T08:27:44.790 に答える
0

を行うと、基になるストリームscan.close()が閉じられます。System.inしたがって、次の反復では読み取るものはありません。

例えば:

import java.io.IOException;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        int value;
        while (true) {
            Scanner scan = new Scanner(System.in);
            System.out.println("Enter a value");
            try {
                value = scan.nextInt();
                System.out.println("value provided is: " + value);
                scan.nextLine(); // consumes "\n" character in buffer
            } catch (InputMismatchException e) // outputs error message if value
                                                // provided is not an integer
            {
                System.out.println("Incorrect input type. Try again.");
                continue; // restarts while loop to allow for re-entering of a
                            // valid input
            }
            scan.close();
            try {
                int x = System.in.read();
                System.out.println(x);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

出力:

Enter a value
10
value provided is: 10
Enter a value
java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:162)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:206)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
    at Main.main(Main.java:24)
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:907)
    at java.util.Scanner.next(Scanner.java:1530)
    at java.util.Scanner.nextInt(Scanner.java:2160)
    at java.util.Scanner.nextInt(Scanner.java:2119)
    at Main.main(Main.java:12)

詳細については、この質問を確認してください。

基礎となる読み取り可能なものを閉じた場合、Java スキャナーを閉じないのは安全ですか?

于 2013-12-23T08:41:00.867 に答える
0

while ループの最後にscan.close(). これにより、スキャナーが閉じられ、それ以上のスキャンが防止されます。そのステートメントを削除すると、 while ループが番号を要求し続けることが保証されます(あなたの場合は無限ループになります)

また、scan.nextInt()事実上、新しい行はすべて無視され、実際に数字を入力してEnterキーを押すまで待機します。というscan.nextLine()ことで、省略可。scan.nextLine()入力した値を取得するために使用する場合にのみ必要です。その場合、改行文字も入力として読み取られるため、それを使用するには追加の nextLine() 呼び出しが必要になります。

于 2013-12-23T08:38:30.990 に答える