记关于多态问题的一个空指针异常bug

2020-03-13  本文已影响0人  凉风拂面秋挽月

最近在写项目代码时出现这样一个空指针问题,t1,t2线程需要同一批的共享变量。这些变量在主线程中初始化后,通过构造方法传递给t1,t2线程后,启动t1,t2。(t1线程为定时检测任务,t2线程t1线程依赖t2线程的结果,故通过阻塞队列完成t2的阻塞,保证共享变量的安全性)。

由于主线程,t1,t2需求的共享变量属性基本相同,故考虑使用父类来将共享变量约定好,然后由主线程给父类的属性赋值,这样t1,t2同样作为子类就可以拿到所需变量了。


image.png

我用一个demo来还原出现nullpoint异常的场景吧。

public class father {
    public  ArrayList<Integer> list;
}
public class son1 extends father{
     son2 s=new son2();
    public void start() {
        list = new ArrayList<Integer>();
        list.add(1);
    }
    public void get() {
        s.get(); 
    }
    public static void main(String[] args) {
    son1 son1 = new son1();     
        son1.start();
        son1.get();
    }
}
public class son2 extends father{
     public void get() {
         System.out.println(list);
     }
}

son1为father赋值之后,son2的get方法去调用父类的list,结果如下所示


image.png

问题就出在我想当然的把所有子类的的父类当成同一个,其实当写出

son1 son1 = new son1(); 
 son2 s=new son2();

的时候,就应该反应过来他们的父类不是同一个,而是各自有各自的父类,所以刚才那张图正确的画法还是


image.png

但同一属性却在三个实现类中写三遍属实难看,且t1,t2线程中存在相似的方法调用,最终的结果是保留父类将主线程,t1,t2线程的属性通过构造方法传递给各自的父类,父类整合各线程的相似方法,并为共通方法提供统一接口,也是把项目在开发中杂乱的逻辑代码重构。方便自己和他人阅读。
就这样吧。

上一篇下一篇

猜你喜欢

热点阅读