如何在线程run()方法中更新类属性?解决空指针异常
解决Thread子类中List属性空指针异常的方案
异常原因
抛出java.lang.NullPointerException是因为你只声明了processedList这个List类型的属性,但从未对它进行初始化,调用add()方法时它的值还是null。
具体解决方法
1. 声明属性时直接初始化
推荐使用线程安全的List实现(因为你继承了Thread,大概率是多线程场景),比如CopyOnWriteArrayList,它天生支持并发添加操作,同时配合volatile保证可见性:
public class ClassProcessing extends Thread { // 直接初始化线程安全的List volatile public List<String> processedList = new CopyOnWriteArrayList<>(); @Override public void run() { String processedElement = "..."; // 你的计算逻辑 this.processedList.add(processedElement); } }
2. 在构造函数中初始化
如果需要根据不同场景选择List实现,可以在构造函数里完成初始化:
public class ClassProcessing extends Thread { volatile public List<String> processedList ; public ClassProcessing() { // 多线程场景用线程安全实现 this.processedList = new CopyOnWriteArrayList<>(); // 单线程场景可使用普通ArrayList(不推荐在多线程环境下用) // this.processedList = new ArrayList<>(); } @Override public void run() { String processedElement = "..."; // 你的计算逻辑 this.processedList.add(processedElement); } }
额外注意事项
volatile关键字仅保证processedList变量本身的可见性,但无法保证List内部操作的线程安全。如果你的场景是多线程并发修改这个List,必须使用线程安全的List实现,避免出现ConcurrentModificationException或者数据不一致的问题。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

