如何解决Java程序输入大数抛出InputMismatchException的问题
异常触发原因
- Java中
int类型为32位有符号整数,取值范围仅为-2147483648 ~ 2147483647,你输入的9999999999远大于int的最大值,调用Scanner.nextInt()时会直接抛出InputMismatchException。 Scanner读取输入失败时,不会自动消费缓冲区里的无效输入:你在div方法里捕获了异常,但没有清空缓冲区里残留的9999999999,回到主循环再次调用scan.nextInt()时,会直接读取缓冲区里残留的无效值,再次抛出异常,而主循环没有异常捕获逻辑,直接导致程序终止。
修复方案
1. 调整变量类型适配大数值
如果需要支持更大范围的整数运算,将num1、num2、sum的类型从int改为long(取值范围-9223372036854775808 ~ 9223372036854775807),如果需要支持任意大小的整数,可以改用BigInteger类型。
2. 输入异常时清空Scanner缓冲区
每次捕获输入相关异常后,调用scan.nextLine()消费掉缓冲区里的无效输入,避免残留内容影响后续读取。
3. 为主循环增加异常捕获逻辑
避免主循环读取用户选项时,因为输入无效内容直接崩溃。
修复后完整代码
import java.util.Scanner; public class JavaExercise1 { // 变量改为long支持更大数值 static long sum, num1, num2; static Scanner scan = new Scanner(System.in); public static void add(){ System.out.print("Enter first number to be added: "); num1 = scan.nextLong(); System.out.print("Enter second number to be added: "); num2 = scan.nextLong(); sum=num1+num2; System.out.println(num1+" + "+num2+" = "+sum); } static void sub(){ System.out.print("Enter first number to be substracted: "); num1 = scan.nextLong(); System.out.print("Enter second number to be substracted: "); num2 = scan.nextLong(); sum=num1-num2; System.out.println(num1+" - "+num2+" = "+sum); } static void mul(){ System.out.print("Enter first number to be multiplied: "); num1 = scan.nextLong(); System.out.print("Enter second number to be multiplied: "); num2 = scan.nextLong(); sum=num1*num2; System.out.println(num1+" x "+num2+" = "+sum); } static void div(){ try{ System.out.print("Enter first number to be divided: "); num1 = scan.nextLong(); System.out.print("Entr second number to be divided: "); num2 = scan.nextLong(); sum=num1/num2; System.out.println(num1+" / "+num2+" = "+sum); }catch(Exception e){ System.out.println("\nException occured..."); System.out.println(e); // 清空缓冲区残留的无效输入 scan.nextLine(); } } static void printInstructions(){ System.out.println("1. Addition\n2. Substraction\n3. Multiplication\n4. Division\n5. Exit"); } public static void main(String[] args) { int ch; do{ System.out.println("\nEnter your choice: (Choose 0 to print instructions)"); try { ch = scan.nextInt(); switch(ch){ case 0: printInstructions(); break; case 1: add(); break; case 2: sub(); break; case 3: mul(); break; case 4: div(); break; case 5: break; default: System.out.println("Invalid choice...."); } } catch (Exception e) { System.out.println("Invalid input, please enter a number"); // 清空无效输入 scan.nextLine(); ch = -1; } }while(ch!=5); // 关闭Scanner释放资源 scan.close(); } }
内容的提问来源于stack exchange,提问作者Prithviraj Tagadinamani
相关产品推荐
相关产品推荐

