美文网首页
记关于多态问题的一个空指针异常bug

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

作者: 凉风拂面秋挽月 | 来源:发表于2020-03-13 22:06 被阅读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线程的属性通过构造方法传递给各自的父类,父类整合各线程的相似方法,并为共通方法提供统一接口,也是把项目在开发中杂乱的逻辑代码重构。方便自己和他人阅读。
    就这样吧。

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/xfgyshtx.html