为了账号安全,请及时绑定邮箱和手机立即绑定

内部类无法访问从内部调用构造函数的方法初始化的外部类成员变量

内部类无法访问从内部调用构造函数的方法初始化的外部类成员变量

慕田峪7331174 2021-06-26 16:49:33
由于未初始化的外部成员变量,下面的代码抛出空指针异常。它在 run 方法中为可运行变量抛出 NPE。我已经在 newFixedThreadPool 方法中初始化了 ConcurrentLinkedQueue 类型的本地变量,并调用了参数化构造函数来初始化可运行成员变量。顺便说一句,当我直接初始化可运行变量而不创建任何局部变量时,代码运行成功。任何人都可以解释这个import java.util.concurrent.ConcurrentLinkedQueue;public class MyExecuterService  {    private  ConcurrentLinkedQueue<Runnable> runnables;    //private AtomicBoolean execute=AtomicBoolean.true;    private PoolWorkerThread poolWorkerThreads[];    public MyExecuterService()    {}    public MyExecuterService(ConcurrentLinkedQueue<Runnable> runnables,PoolWorkerThread poolWorkerThreads1[])    {        this.runnables=runnables;        poolWorkerThreads=poolWorkerThreads1;    }    private class PoolWorkerThread extends Thread{        @Override        public void run() {            while(true) {                System.out.println(runnables.size()+"runnable"+runnables);                synchronized (runnables) {                    if(runnables.size()==0)                    {                        try {                        runnables.wait();                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                    }                    else                    {                        Runnable task=runnables.poll();                        task.run();                        //notify();                    }                }               }        }    }    public  MyExecuterService newFixedThreadPool(int i)    {        ConcurrentLinkedQueue<Runnable> runnableQueue= new ConcurrentLinkedQueue<Runnable>();        PoolWorkerThread [] threads= new PoolWorkerThread[i];        for (int j = 0; j < i; j++) {            threads[j]= new PoolWorkerThread();            threads[j].start();        }        return new MyExecuterService(runnableQueue, threads);    }
查看完整描述

1 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

NullPointerException是由于数据成员MyExecuterService没有被初始化。

MyExecuterServicenew FixedThreadPool(int i)方法中使用参数创建了对象,但由于此方法属于MyExecuterService它自己,因此要访问此方法,您必须创建一个MyExecuterService对象。然后只有您可以访问该对象。

现在由于MyExecuterService使用空参数构造函数创建对象而发生异常,因此未初始化数据成员。

只需检查您调用the newFixedThreadPool(int i)方法的对象,并确保该对象是使用参数化构造函数创建的。

顺便说一下,你的MyExecuterService类设计是一种假设。


查看完整回答
反对 回复 2021-06-30
  • 1 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号