InputMismatchException
は、Scanner
が読み込もうとしたデータが、期待される型と一致しない場合に発生します。
プログラムでは、2つの整数の後に演算子(文字列)が来ることを期待していますが、Scanner
が整数を読み込もうとする前に文字列が入力されると、InputMismatchException
が発生します。
また、プログラムのロジックには別の問題があります。それは、op
が'?'
の場合にも、a
とb
を読み込んでしまう点です。op
が'?'
の場合、プログラムは入力の終わりを示すため、それ以上の入力(特にa
とb
)を読み込むべきではありません。
以下の修正を加えることで、これらの問題を解決できます:
- 演算子
op
を先に読み込み、それが'?'
であるかどうかをチェックします。これにより、不要なa
とb
の読み込みを避けることができます。
-
nextInt
を呼び出す前にhasNextInt
メソッドを使って、次の入力が整数であるかどうかを確認します。これにより、意図しない型の入力を検出し、例外を回避することができます。
修正したコードは次のようになります:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(true){
String op = sc.next(); // 演算子を先に読み込む
if (op.equals("?")) { // 入力の終わり
break;
}
int a = sc.nextInt(); // 次に整数aを読み込む
int b = sc.nextInt(); // 次に整数bを読み込む
switch(op) {
case "+":
System.out.println(a + b);
break;
case "-":
System.out.println(a - b);
break;
case "*":
System.out.println(a * b);
break;
case "/":
System.out.println(a / b);
break;
}
}
sc.close();
}
}
この修正により、op
が'?'
の場合には、それ以上何も読み込まずにループを抜け、プログラムを終了するようになります。