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é
相关产品推荐
相关产品推荐

