0

このコードが期待どおりに機能する理由がわかりません。

package myPackage;

import java.util.InputMismatchException;
import java.util.Scanner;

public class ScanTest {

    public static void main(String[] args) 
    {
        Scanner scan1, scan2;
        double weight = 0.0;

        scan1 = new Scanner(System.in);
        System.out.print("Enter a rational: ");
        try {
            weight = scan1.nextDouble();
            System.out.println("You entered " + weight);
        }
        catch(InputMismatchException ime) {
            System.out.println("Invalid data.");
        }
        scan1.close();

        /*scan2 = new Scanner(System.in);
        System.out.print("Enter a rational: ");
        try {
            weight = scan2.nextDouble();
            System.out.println("You entered " + weight);
        }
        catch(InputMismatchException ime) {
            System.out.println("Invalid data.");
        }
        scan2.close();*/
    }
}

そしてこのコードは失敗します:

package myPackage;

import java.util.InputMismatchException;
import java.util.Scanner;

public class ScanTest {

    public static void main(String[] args) 
    {
        Scanner scan1, scan2;
        double weight = 0.0;

        scan1 = new Scanner(System.in);
        System.out.print("Enter a rational: ");
        try {
            weight = scan1.nextDouble();
            System.out.println("You entered " + weight);
        }
        catch(InputMismatchException ime) {
            System.out.println("Invalid data.");
        }
        scan1.close();

        scan2 = new Scanner(System.in);
        System.out.print("Enter a rational: ");
        try {
            weight = scan2.nextDouble();
            System.out.println("You entered " + weight);
        }
        catch(InputMismatchException ime) {
            System.out.println("Invalid data.");
        }
        scan2.close();
    }
}

(2つのバージョンはほぼ同じであることに注意してください。2番目のバージョンにはコメントされていないブロックがあります。)

2番目のバージョンから得られる出力は次のとおりです。

Enter a rational: .97
You entered 0.97
Enter a rational: 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.nextDouble(Unknown Source)
    at myPackage.ScanTest.main(ScanTest.java:28)

Scannerオブジェクトが最初のブロックで入力を待機する理由がわかりませんが、2番目のブロックで例外をスローします。私が期待する動作は次のとおりです。

Enter a rational: .97
You entered 0.97
Enter a rational: .43
You entered 0.43

問題のある行28は次のとおりです。

重み=scan2.nextDouble();

この振る舞いについて誰かの洞察をいただければ幸いです。

4

1 に答える 1

2

ストリームからこれ以上データを読み取れないようにするために、への呼び出しscan1.close()も終了すると思います。ここでメソッドの説明System.inを確認してください。close()

したがって...から読み取りを開始するまでscan2に、System.inはデータを返しません。

于 2013-01-21T20:29:13.093 に答える