Java使用Scanner校验整数输入并求和时出现三次输入、逻辑错位异常
代码运行异常问题
实际表现
这段代码的预期逻辑是:接收a、b两个用户输入,校验两个输入都是整数后计算二者之和。但实际运行时:
- 程序会要求用户连续输入3次内容
- 输出结果完全错位:用前两次输入的数值计算了求和值,把后两次输入对应的有效性判定值打印了出来,和预期逻辑完全不符。
原始问题代码
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Enter first number"); int a = sc.nextInt(); boolean aValid = sc.hasNextInt(); System.out.println(aValid); System.out.println("Enter Second number"); int b = sc.nextInt(); boolean bValid = sc.hasNextInt(); System.out.println(bValid); if(aValid && bValid){ System.out.println("Sum of number is "+(a+b)); } else{ System.out.println("Enter integer number"); } } }
问题根因
代码完全颠倒了Scanner两个核心方法的执行时序:
nextInt()会直接从输入流读取下一个整数赋值给变量,如果当前输入不是整数会直接抛出运行时异常,根本没有预留校验的空间hasNextInt()的作用是判断输入流中尚未被读取的待处理内容是不是整数,它无法校验已经被nextInt()读走的内容
按照现有代码的执行流:
- 提示用户输入第一个数,
nextInt()读走用户第一次输入的内容赋值给a,随后的hasNextInt()会阻塞等待用户的第二次输入,判断第二次输入的内容是不是整数,把结果存为aValid - 提示用户输入第二个数,
nextInt()读走用户第二次输入的内容赋值给b,随后的hasNextInt()会阻塞等待用户的第三次输入,判断第三次输入的内容是不是整数,把结果存为bValid
这就是为什么程序需要用户输入3次,最后输出逻辑完全错位的原因。
修正方案
正确的校验顺序必须调整为:先调用hasNextInt()判断当前待读取的输入是否为整数,确认合法后再调用nextInt()读取值赋值给变量。
修正后的可正常运行的代码:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 校验第一个输入 System.out.println("Enter first number"); boolean aValid = sc.hasNextInt(); if (!aValid) { System.out.println("Enter integer number"); return; } int a = sc.nextInt(); // 校验第二个输入 System.out.println("Enter Second number"); boolean bValid = sc.hasNextInt(); if (!bValid) { System.out.println("Enter integer number"); return; } int b = sc.nextInt(); // 两个输入均合法时计算并输出和 System.out.println("Sum of number is " + (a + b)); } }
内容的提问来源于stack exchange,提问作者Bilal Ahamed
相关产品推荐
相关产品推荐

