小功能的Java标准代码也不容易
/** 任务:从键盘上输入一个人的体重(公斤)和身高(米),计算BMI指数并输出体重状态 体重指标(Body Mass Index)= 体重 / 身高的平方(kg/m2) BMI < 18.5 :偏瘦 BMI < 24:正常 BMI < 27:偏胖 BMI < 30:肥胖 BMI >= 30:重度肥胖 */
自己写的代码
import java.util.Scanner;
class Bmi { private double weight; private double height; private double bmi; private String fat;
▼text复制代码public Bmi(){} public Bmi(double weight, double height){ this.weight = weight; this.height = height; } public void getInfo(){ System.out.println("您的体重是:" + this.weight + " kg,您的身高是:" + this.height + " cm"); } public void setWeight(double weight){ this.weight = weight; } public void setHeight(double height){ this.height = height; } public double getWeight(){ return this.weight; } public double getHeight(){ return this.height; } public double getBmi(){ bmi = weight / ((height / 100) * (height / 100)); return this.bmi; } public String getFat(){ if (bmi < 18.5) {this.fat = "偏瘦";} if (bmi < 24 && bmi > 18.5) {this.fat = "正常";} if (bmi < 27 && bmi > 24) { this.fat = "偏胖";} if (bmi < 30 && bmi > 27) {this.fat = "肥胖";} if (bmi >= 30) { this.fat = "重度肥胖";} return this.fat; }
}
public class Java2026090108 {
▼text复制代码public static void main(String[] args){ Scanner sc = new Scanner(System.in); // 1、接收输入的体重 System.out.print("请输入您的体重(公斤):"); double weight = sc.nextDouble(); // 1、接收输入的身高 System.out.print("请输入您的身高(厘米):"); double height = sc.nextDouble(); Bmi bmi = new Bmi(); bmi.setWeight(weight); bmi.setHeight(height); System.out.println(); System.out.println("===========输入您的体重和身高,输出身体的健康BMI================\n"); // 3、判断BMI bmi.getInfo(); System.out.printf("%n您的BMI指标是:%,.2fkg/m2%n%n",bmi.getBmi()); System.out.printf("您的体型属于:%s%n",bmi.getFat()); }
}
问题
1、空壳对象风险:提供了无参构造器 public Bmi(){},可以创建出 weight=0, height=0 的非法对象 2、边界值黑洞:getFat() 用独立的 if 且条件互斥(如 bmi=18.5 时没有任何条件满足),返回 null 3、getter有副作用:getBmi() 在返回值的同时修改了成员变量 this.bmi 4、调用顺序依赖:getFat() 依赖 getBmi() 先被调用,否则 bmi 为 0.0 5、无参构造器绕过了校验:main 里用 new Bmi() + setter 赋值,完全没有参数合法性检查 6、Scanner未关闭:sc.close() 缺失 7、魔法数字:18.5、24、27、30 直接硬编码在方法里 8、注释与代码单位不一致:注释写"身高(米)",实际按厘米处理(height / 100)
Kimi帮助下写的代码
`import java.util.Scanner;
class BMI { private static final double THIN = 18.5; // BMI阈值 private static final double NORMAL = 24; // BMI阈值 private static final double OVERWEIGHT = 27; // BMI阈值 private static final double OBESE = 30; // BMI阈值
▼text复制代码private final double weight; // 体重,公斤 private final double height; // 身高,厘米 public BMI(double weight, double height) { if (weight <= 0 || height <= 0) { throw new IllegalArgumentException("体重和身高必须大于 0"); } this.weight = weight; this.height = height; } @Override public String toString() { return String.format("您的体重是:%.2f kg,身高:%.2f cm", weight, height); } public double getWeight() { return this.weight; } public double getHeight() { return this.height; } public double getBMI() { return weight / Math.pow((height / 100), 2); } public String getBMIStatus() { double bmi = getBMI(); if (bmi < THIN) { return "偏瘦"; } else if (bmi < NORMAL) { return "正常"; } else if (bmi < OVERWEIGHT) { return "偏胖"; } else if (bmi < OBESE) { return "肥胖"; } else { return "重度肥胖"; } }
}
public class Java2026090109 {
▼text复制代码public static void main(String[] args) { try (Scanner sc = new Scanner(System.in)) { // 判断输入是否合法? double weight = readPositiveDouble(sc, "请输入您的体重(公斤):"); double height = readPositiveDouble(sc, "请输入您的身高(厘米):"); BMI person = new BMI(weight, height); printResult(person); } catch (IllegalArgumentException e) { System.out.println("!系统错误:" + e.getMessage()); } } private static void printResult(BMI person) { System.out.println("\n-------------------------------------------------------"); System.out.println(person); System.out.println("======================================================="); System.out.printf("%n您的BMI指标是:%.2fkg/m\u00B2%n", person.getBMI()); System.out.printf("您的体型属于:%s%n", person.getBMIStatus()); } // 输入的时候就判断数据的合法性 private static double readPositiveDouble(Scanner sc, String prompt) { while (true) { System.out.print(prompt); String line = sc.nextLine().trim(); // 去除两头的空格 if (line.isEmpty()) { System.out.println(">>>错误!输入不能为空,请输入有效的数字!<<<\n"); continue; } try { double value = Double.parseDouble(line); if (value <= 0) { System.out.println(">>>错误!输入值必须大于 0 !!!请重新输入!<<<\n"); } else { return value; } } catch (NumberFormatException e) { System.out.println(">>>错误:\"" + line + "\"不是有效的数字,请重新输入!<<<\n"); } } }
}`
Kimi改的代码
import java.util.Scanner;
/**
- BMI 体型分类枚举
- 每个枚举值持有:中文描述、BMI下限、BMI上限 */
enum BMIStatus { THIN("偏瘦", 0, 18.5), NORMAL("正常", 18.5, 24.0), OVERWEIGHT("偏胖", 24.0, 27.0), OBESE("肥胖", 27.0, 30.0), SEVERELY_OBESE("重度肥胖", 30.0, Double.MAX_VALUE);
▼text复制代码private final String description; // 中文描述 private final double min; // 区间下限(包含) private final double max; // 区间上限(不包含) // 枚举构造器默认就是 private,可以省略 private 关键字 BMIStatus(String description, double min, double max) { this.description = description; this.min = min; this.max = max; } public String getDescription() { return description; } /** * 根据 BMI 值查找对应的分类 */ public static BMIStatus fromBMI(double bmi) { for (BMIStatus status : values()) { if (bmi >= status.min && bmi < status.max) { return status; } } throw new IllegalArgumentException("无法识别的 BMI 值: " + bmi); } @Override public String toString() { return description; }
}
class BMI { private final double weight; private final double height;
▼text复制代码public BMI(double weight, double height) { if (weight <= 0 || height <= 0) { throw new IllegalArgumentException("体重和身高必须大于 0"); } this.weight = weight; this.height = height; } @Override public String toString() { return String.format("体重:%.1f kg,身高:%.1f cm", weight, height); } public double getWeight() { return weight; } public double getHeight() { return height; } public double getBMI() { return weight / Math.pow(height / 100.0, 2); } /** * 返回值从 String 升级为 BMIStatus 枚举 */ public BMIStatus getBMIStatus() { return BMIStatus.fromBMI(getBMI()); }
}
public class Java2026090109 {
▼text复制代码public static void main(String[] args) { try (Scanner sc = new Scanner(System.in)) { double weight = readPositiveDouble(sc, "请输入您的体重(公斤):"); double height = readPositiveDouble(sc, "请输入您的身高(厘米):"); BMI person = new BMI(weight, height); printResult(person); } catch (IllegalArgumentException e) { System.out.println("系统错误:" + e.getMessage()); } } private static void printResult(BMI person) { System.out.println("\n-------------------------------------------------------"); System.out.println(person); System.out.println("======================================================="); System.out.printf("%n您的 BMI 指标是:%.2f kg/m\u00B2%n%n", person.getBMI()); // %s 会自动调用枚举的 toString(),输出中文描述 System.out.printf("您的体型属于:%s%n", person.getBMIStatus()); } private static double readPositiveDouble(Scanner sc, String prompt) { while (true) { System.out.print(prompt); String line = sc.nextLine().trim(); if (line.isEmpty()) { System.out.println(">>> 错误!输入不能为空,请输入有效的数字!"); continue; } try { double value = Double.parseDouble(line); if (value <= 0) { System.out.println(">>> 错误!输入值必须大于 0,请重新输入!"); } else { return value; } } catch (NumberFormatException e) { System.out.println(">>> 错误:\"" + line + "\" 不是有效的数字,请重新输入!"); } } }
}
