このコードが期待どおりに機能する理由がわかりません。
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();
この振る舞いについて誰かの洞察をいただければ幸いです。