You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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语句结构,仅得到上述两种结果之一

问题分析与修复

核心问题

  1. Scanner缓冲区残留换行符:l.nextInt()只读取整数,输入时的换行符会留在缓冲区,后续l.nextLine()直接读取空字符串,导致ans为空,不匹配任何预期值,触发错误提示。
  2. 逻辑表达式错误:!(Objects.equals(ans, "Yes") && !(Objects.equals(ans, "No")))的逻辑等价于!Objects.equals(ans, "Yes") || Objects.equals(ans, "No"),只要ans不是"Yes"就会触发该分支,逻辑完全错误。
  3. 递归调用未处理返回值:输入"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:53:20