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

Java BMI计算器条件分支异常:非m/i输入时输出错误结果

BMI计算器非法输入后仍显示BMI分类的问题分析

问题根源

你的代码存在两个关键问题:

  1. 处理非法输入的else分支被注释,导致输入m/i以外的内容时没有任何错误提示
  2. BMI分类判断的代码块与前面的单位选择分支完全独立,无论单位输入是否合法,程序都会执行这段代码。加上你初始化bmi = 0,非法输入时bmi值始终为0,会触发bmi < 18.5的分支,输出错误的体重分类信息。

修复方案

方案一:将BMI分类逻辑纳入合法输入分支

把体重分类的代码块分别放到m和i对应的if/else if分支内部,这样只有合法输入时才会执行分类判断:

import java.util.Scanner;

public class BmiCalculator {

    public static void main(String[] args) 
    {
        Scanner reader = new Scanner(System.in);
        System.out.println("Welcome to Freddy Fazbear's BMI Calculator!");
        System.out.println("[=========================================]");
        System.out.print("What unit system do you want to use? metric or imperial (m/i)?: ");
        String units = reader.next();
        double meters, kilos, feet, lbs, bmi = 0;
        
        if (units.equalsIgnoreCase("m")) 
        {
            System.out.print("Please enter your Height(m): ");
            meters = reader.nextDouble();
            System.out.print("Please enter your Weight(kg): ");
            kilos =  reader.nextDouble();
            
            bmi = kilos / (meters * meters);
            feet = meters*3.28;
            lbs = kilos*2.2;
            System.out.println("Your BMI is ---> " + bmi);
            System.out.println("Your height in (meters) is " + meters);
            System.out.println("Your weight in (kilograms) is " + kilos);
            System.out.println("Your height in (feet) is " + feet);
            System.out.println("Your weight in (pounds) is " + lbs);
            
            // 将BMI分类逻辑移到此处
            showBmiCategory(bmi);
        }
        
        else if (units.equalsIgnoreCase("i")) 
        {
            System.out.print("Please enter your Height(feet): ");
            feet = reader.nextDouble();
            System.out.print("Please enter your Weight(pounds): ");
            lbs =  reader.nextDouble();
            
            meters = feet/3.28;
            kilos = lbs/2.2;
            feet = feet*12;
            bmi = 703*(lbs / (feet * feet));
            System.out.println("============================");
            System.out.println("Your BMI is ---> " + bmi);
            System.out.println("Your height in (meters) is " + meters);
            System.out.println("Your weight in (kilograms) is " + kilos);
            System.out.println("Your height in (feet) is " + feet/12);
            System.out.println("Your weight in (pounds) is " + lbs);
            
            // 将BMI分类逻辑移到此处
            showBmiCategory(bmi);
        }
        // 恢复错误提示分支
        else {
            System.out.println("Invalid Input!");
        }
        
        reader.close();
    }
    
    // 提取BMI分类逻辑为单独方法,避免代码重复
    private static void showBmiCategory(double bmi) {
        if (bmi < 18.5) 
        {
            System.out.println("You are Underweight");
            System.out.println("Gain some weight skinny!");
        }
        else if (bmi > 18.5 && bmi < 24.9)
        {
            System.out.println("You are Healthy!");
            System.out.println("Keep it up buddy!");
        }
        else
        {
            System.out.println("You are Overweight!");
            System.out.println("Lose some weight chubby!");
        }
    }

}

方案二:使用标志位控制分类逻辑执行

如果不想移动代码,可以添加一个布尔变量标记输入是否合法,只有合法时才执行分类判断:

import java.util.Scanner;

public class BmiCalculator {

    public static void main(String[] args) 
    {
        Scanner reader = new Scanner(System.in);
        System.out.println("Welcome to Freddy Fazbear's BMI Calculator!");
        System.out.println("[=========================================]");
        System.out.print("What unit system do you want to use? metric or imperial (m/i)?: ");
        String units = reader.next();
        double meters, kilos, feet, lbs, bmi = 0;
        // 添加标志位标记输入是否合法
        boolean isValidInput = true;
        
        if (units.equalsIgnoreCase("m")) 
        {
            System.out.print("Please enter your Height(m): ");
            meters = reader.nextDouble();
            System.out.print("Please enter your Weight(kg): ");
            kilos =  reader.nextDouble();
            
            bmi = kilos / (meters * meters);
            feet = meters*3.28;
            lbs = kilos*2.2;
            System.out.println("Your BMI is ---> " + bmi);
            System.out.println("Your height in (meters) is " + meters);
            System.out.println("Your weight in (kilograms) is " + kilos);
            System.out.println("Your height in (feet) is " + feet);
            System.out.println("Your weight in (pounds) is " + lbs);
        }
        
        else if (units.equalsIgnoreCase("i")) 
        {
            System.out.print("Please enter your Height(feet): ");
            feet = reader.nextDouble();
            System.out.print("Please enter your Weight(pounds): ");
            lbs =  reader.nextDouble();
            
            meters = feet/3.28;
            kilos = lbs/2.2;
            feet = feet*12;
            bmi = 703*(lbs / (feet * feet));
            System.out.println("============================");
            System.out.println("Your BMI is ---> " + bmi);
            System.out.println("Your height in (meters) is " + meters);
            System.out.println("Your weight in (kilograms) is " + kilos);
            System.out.println("Your height in (feet) is " + feet/12);
            System.out.println("Your weight in (pounds) is " + lbs);
        }
        else {
            System.out.println("Invalid Input!");
            isValidInput = false; // 标记输入非法
        }
        
        // 只有输入合法时才执行分类逻辑
        if (isValidInput) {
            if (bmi < 18.5) 
            {
                System.out.println("You are Underweight");
                System.out.println("Gain some weight skinny!");
            }
            else if (bmi > 18.5 && bmi < 24.9)
            {
                System.out.println("You are Healthy!");
                System.out.println("Keep it up buddy!");
            }
            else
            {
                System.out.println("You are Overweight!");
                System.out.println("Lose some weight chubby!");
            }
        }
        
        reader.close();
    }

}

额外优化建议

  • 去掉不必要的强制类型转换(比如(float) reader.nextDouble()),double类型足以满足计算需求
  • 将重复的BMI分类逻辑提取为单独方法,提升代码可读性和可维护性

内容的提问来源于stack exchange,提问作者Cyrix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:35:59