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

如何修复通过当前年份减出生年份计算年龄的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:44:29