Java BMI计算器条件分支异常:非m/i输入时输出错误结果
BMI计算器非法输入后仍显示BMI分类的问题分析
问题根源
你的代码存在两个关键问题:
- 处理非法输入的
else分支被注释,导致输入m/i以外的内容时没有任何错误提示 - 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
相关产品推荐
相关产品推荐

