Java程序中特定if语句自动执行异常问题求助
问题:血压输入程序中无效输入提示异常触发
我正在编写一个课程用Java程序,用于获取用户输入的收缩压(systolic)和舒张压(diastolic)整数值,并返回对应诊断结果。目前项目进行到一半,但无法找出某段else if代码块自动执行的原因。
完整代码
import java.util.InputMismatchException; import java.util.Objects; import java.util.Scanner; public class Main { //create method for getting blood pressure and handling exceptions private static int getPressure (Scanner l, int num, String pres) { //localize variables l = new Scanner(System.in); String ans; //get user input only if it is an integer, otherwise return error message //and get user input again while (true) { try { System.out.println("Please input " + pres + " Blood Pressure:"); num = l.nextInt(); break; } catch (InputMismatchException e) { System.out.println("Sorry, that didn't work. Please ensure your input is a whole number."); l.next(); } } //Verify user input is as intended, otherwise take input again System.out.println("You typed " + num + ", is that correct? (Yes/No)"); //take input ans = l.nextLine(); //if input does not match one of expected values ("Yes" and "No") //return error message and take input again do { if (Objects.equals(ans, "Yes")) { break; } else if (Objects.equals(ans, "No")) { getPressure(l, num, pres); } else if(!(Objects.equals(ans, "Yes") && !(Objects.equals(ans, "No")))) { System.out.println("Sorry, invalid input, please type 'Yes' or 'No'"); } } while (true); return num; } public static void main(String[] args) { //Declare variables int sys = 0; int dias = 0; String systolic = "Systolic"; String diastolic = "Diastolic"; Scanner p = new Scanner(System.in); getPressure(p, sys, systolic); getPressure(p, dias, diastolic); } }
自动执行的代码块
else if(!(Objects.equals(ans, "Yes") && !(Objects.equals(ans, "No")))) { System.out.println("Sorry, invalid input, please type 'Yes' or 'No'"); }
预期输入输出
Please input Systolic Blood Pressure:
'120'
You typed 120, is that correct? (Yes/No)
'Yes'
Please input Diastolic Blood Pressure:
'90'
Process finished with exit code ...
实际输入输出
Please input Systolic Blood Pressure:
'120'
You typed 120, is that correct? (Yes/No)
'Yes'
Sorry, invalid input please type 'Yes' or 'No'
Please input Diastolic Blood Pressure:
'90'
Process finished with exit code ...
已尝试的操作
- 在多处添加
l.next(),但会无限返回错误提示 - 使用
ans.equals(),效果同添加l.next() - 调整if/else if/else语句结构,仅得到上述两种结果之一
问题分析与修复
核心问题
- Scanner缓冲区残留换行符:
l.nextInt()只读取整数,输入时的换行符会留在缓冲区,后续l.nextLine()直接读取空字符串,导致ans为空,不匹配任何预期值,触发错误提示。 - 逻辑表达式错误:
!(Objects.equals(ans, "Yes") && !(Objects.equals(ans, "No")))的逻辑等价于!Objects.equals(ans, "Yes") || Objects.equals(ans, "No"),只要ans不是"Yes"就会触发该分支,逻辑完全错误。 - 递归调用未处理返回值:输入"No"时递归调用
getPressure,但未用递归结果覆盖当前num,也未终止当前循环,导致后续逻辑混乱。
修复后的代码
import java.util.InputMismatchException; import java.util.Objects; import java.util.Scanner; public class Main { private static int getPressure(Scanner scanner, String pres) { int num; // 读取有效整数 while (true) { try { System.out.println("Please input " + pres + " Blood Pressure:"); num = scanner.nextInt(); // 读取整数后清空换行符 scanner.nextLine(); break; } catch (InputMismatchException e) { System.out.println("Sorry, that didn't work. Please ensure your input is a whole number."); scanner.next(); } } // 确认输入是否正确 while (true) { System.out.println("You typed " + num + ", is that correct? (Yes/No)"); String ans = scanner.nextLine().trim(); if (Objects.equals(ans, "Yes")) { return num; } else if (Objects.equals(ans, "No")) { // 递归调用并返回新输入的值 return getPressure(scanner, pres); } else { System.out.println("Sorry, invalid input, please type 'Yes' or 'No'"); } } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int sys = getPressure(scanner, "Systolic"); int dias = getPressure(scanner, "Diastolic"); // 后续可添加诊断逻辑 scanner.close(); } }
修复要点
- 读取整数后调用
scanner.nextLine()清空缓冲区的换行符,避免后续读取空字符串 - 简化确认输入的循环逻辑,每次循环重新读取用户输入,无需嵌套do-while
- 修正无效输入的判断,直接用else分支处理非"Yes"/"No"的情况
- 递归调用时直接返回结果,终止当前方法的执行,避免逻辑混乱
- 优化参数传递,无需传入初始num值,减少冗余
内容的提问来源于stack exchange,提问作者Dharco
相关产品推荐
相关产品推荐

