如何修复通过当前年份减出生年份计算年龄的Java代码错误?
嘿,我来帮你搞定这个年龄计算的bug!你的代码里有几个关键问题导致了奇怪的输出,咱们一个个拆解修复:
问题分析与修复步骤
1. 错误获取年份:取字符ASCII值而非实际数字
第一个坑就是你获取年份的方式不对:你在getCurrentYear和getBirthYear里用了charAt(0),这会把输入年份的第一个字符转换成它的ASCII码值(比如输入2024,第一个字符是'2',对应的ASCII数值是50),这就是为啥输出里会出现50.0这种奇怪数字的原因!
修复方法:直接用Scanner的nextInt()方法读取整数,不需要转字符:
public void getCurrentYear() { System.out.println("What is the current year"); currentYear = lookAtKeyboard.nextInt(); } public void getBirthYear() { System.out.println("What is your birth year"); birthYear = lookAtKeyboard.nextInt(); }
2. 方法参数与类成员重名,导致作用域混乱
你的doMath方法定义了和类静态成员同名的参数double birthYear, double currentYear,这会在方法内部覆盖掉类的静态成员,而且年龄计算用整数就足够,完全没必要用double类型。另外输出时"minus"前后没加空格,导致字符串连在一起,看起来很奇怪。
修复后的doMath方法(直接用类里的成员变量,不用额外传参):
public void doMath() { int age = currentYear - birthYear; System.out.println(currentYear + " minus " + birthYear + " = " + age); }
对应的调用也要改成:
calculator.doMath();
3. 静态成员的不必要使用
你把currentYear和birthYear定义为静态成员,但这个计算器是实例化使用的,用实例成员更合理,避免静态变量带来的潜在问题(比如多个实例互相干扰):
把类里的成员定义改成:
String firstName; int currentYear; // 去掉static修饰符 int birthYear; // 去掉static修饰符
4. Scanner读取后的换行问题(可选优化)
因为你先用nextLine()读取名字,之后用nextInt()会留下换行符,可能导致后续输入异常,所以可以在nextInt()之后加一个lookAtKeyboard.nextLine()来消费多余的换行:
public void getCurrentYear() { System.out.println("What is the current year"); currentYear = lookAtKeyboard.nextInt(); lookAtKeyboard.nextLine(); // 消费换行符,避免后续输入问题 } public void getBirthYear() { System.out.println("What is your birth year"); birthYear = lookAtKeyboard.nextInt(); lookAtKeyboard.nextLine(); // 消费换行符 }
完整修复后的代码
import java.util.Scanner; public class AgeMath { // 类名首字母大写,符合Java命名规范 String firstName; int currentYear; int birthYear; Scanner lookAtKeyboard = new Scanner(System.in); public void getFirstName() { System.out.println("What is your first name"); firstName = lookAtKeyboard.nextLine(); } public void getCurrentYear() { System.out.println("What is the current year"); currentYear = lookAtKeyboard.nextInt(); lookAtKeyboard.nextLine(); // 处理换行符 } public void getBirthYear() { System.out.println("What is your birth year"); birthYear = lookAtKeyboard.nextInt(); lookAtKeyboard.nextLine(); // 处理换行符 } public void doMath() { int age = currentYear - birthYear; System.out.println(currentYear + " minus " + birthYear + " = " + age); } public static void main(String[] args) { AgeMath calculator = new AgeMath(); calculator.getFirstName(); calculator.getCurrentYear(); calculator.getBirthYear(); calculator.doMath(); } }
内容的提问来源于stack exchange,提问作者Niles Doswell
相关产品推荐
相关产品推荐

