如何在不同模块中正确修改UserInfo类实例的userPhone属性?
问题分析与解决方案
你遇到的问题核心是重新声明了一个未初始化的UserInfo变量,直接赋值导致空指针异常(NullPointerException)。
为什么会出错?
你在另一个模块里写的UserInfo user;只是声明了一个新的UserInfo类型变量,但这个变量并没有指向任何实际的对象(它的值是null)。直接对null对象的属性赋值,自然会抛出错误。
而且顺便提一句:你最初的初始化代码其实也有遗漏——UserInfo user;只是声明变量,必须通过new UserInfo()来创建对象实例,不然一开始的赋值也会报错,应该是你写的时候漏了这步对吧?
正确的实现方式
要修改原有对象的userPhone,关键是要拿到之前已经创建并赋值好的那个UserInfo实例,而不是重新声明新变量。这里分两种常见场景:
场景1:通过方法参数传递对象(推荐)
如果两个模块是通过方法调用交互,直接把原有UserInfo对象作为参数传给修改方法即可:
// 在另一个模块的类中定义修改方法 public void updateUserPhone(UserInfo existingUser) { // 直接修改传入的已有对象的属性 existingUser.userPhone = 5555555; } // 在原来的模块中调用这个方法,传入已初始化好的user对象 // 注意:这里的user是你之前已经new并赋值过的实例 updateUserPhone(user);
场景2:通过全局状态访问对象(不推荐大型应用,适合小型场景)
如果两个模块没有直接的方法调用关系,可以把原有对象放到一个全局可访问的容器中,比如静态类的静态字段:
// 先定义一个全局存储类 public class AppGlobalData { public static UserInfo currentLoggedInUser; } // 在原来的初始化代码中,把创建好的对象存入全局容器 UserInfo user = new UserInfo(); // 必须先实例化对象! user.userName = "Mani"; user.userAddress = "No12, XYZ Street"; user.userCity = "WorldCity"; user.userPhone = 1234567; AppGlobalData.currentLoggedInUser = user; // 在另一个模块中修改属性(记得先判空,避免空指针) if (AppGlobalData.currentLoggedInUser != null) { AppGlobalData.currentLoggedInUser.userPhone = 5555555; }
额外提示
如果你的UserInfo类是在多线程环境下使用,建议给userPhone属性加上线程安全的处理(比如用volatile关键字,或者加同步锁),避免并发修改导致的问题。
内容的提问来源于stack exchange,提问作者Subramanian
相关产品推荐
相关产品推荐

