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

Java程序无报错但结果异常:输入值重置为默认值求助

解决你的Java变量重置问题

嘿,别慌!马上要考试了,咱们快速把这个问题搞定~你的程序没语法错,但运行结果不对的核心原因是Java的参数传递规则,我来给你拆解清楚:

问题根源:Java是值传递

你在info()和calc()方法里修改的name、age、dob这些参数,其实都是主方法里原始变量的副本。方法执行完后,副本会被销毁,原始变量根本没被修改,所以最后result()输出的还是初始默认值(空字符串、0)。

另外还有个小问题:你在info()里创建了3个Scanner对象,完全没必要,一个就够了,多了反而可能导致输入异常。

修正方案:用自定义对象封装数据

因为Java没法直接返回多个值,最规范的方式是创建一个类来封装用户的信息,通过引用传递修改对象的属性(对象的引用是按值传递,但修改对象内部的属性会影响原始对象)。

修正后的完整代码

package Practice1.pkg1;
import java.time.Year;
import java.util.Scanner;

// 自定义类封装用户信息
class UserInfo {
    String name;
    String surname;
    int age;
    int dob;
}

public class Sub1 {
    public static void main(String[] args) {
        UserInfo user = new UserInfo();
        int currentYear = Year.now().getValue();
        
        info(user);
        calc(user, currentYear);
        result(user);
    }

    // 接收UserInfo对象,直接修改其属性
    public static void info(UserInfo user) {
        Scanner input = new Scanner(System.in);
        
        System.out.println("What is your name user?");
        user.name = input.nextLine();
        
        System.out.println("What is your surname user?");
        user.surname = input.nextLine();
        
        System.out.println("What is your age user?");
        user.age = Integer.parseInt(input.nextLine());
        
        input.close(); // 用完关闭Scanner
    }

    // 计算出生年份,直接赋值给UserInfo对象的dob属性
    public static void calc(UserInfo user, int currentYear) {
        user.dob = currentYear - user.age;
    }

    // 直接使用UserInfo对象的属性输出结果
    public static void result(UserInfo user) {
        System.out.println("Welcome " + user.name + " " + user.surname + " born in " + user.dob);
    }
}

关键修改点说明

  • 新增UserInfo类,把用户的姓名、姓氏、年龄、出生年份都封装进去,这样方法可以直接操作对象的属性,避免副本问题。
  • 只创建一个Scanner对象,用完关闭,避免资源浪费和输入问题。
  • 所有方法都接收UserInfo对象作为参数,修改对象内部的属性会同步到主方法中的原始对象,这样就不会出现值重置的情况了。

额外提醒(考试重点)

Java的参数传递规则是高频考点:

  • 基本数据类型(int、char等)是值传递:方法接收的是原始值的副本,修改副本不影响原始值。
  • 引用数据类型(对象、数组)是引用的传递:方法接收的是对象引用的副本,但副本指向的是同一个对象,所以修改对象的属性会影响原始对象。

这样修改后,你的程序就能正确输出用户输入的信息啦,祝你考试顺利!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:40:34