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

由于未初始化的外部成员变量,下面的代码抛出空指针异常。它在 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);

    }


慕田峪7331174
浏览 183回答 1
1回答

狐的传说

这NullPointerException是由于数据成员MyExecuterService没有被初始化。您MyExecuterService在new FixedThreadPool(int i)方法中使用参数创建了对象,但由于此方法属于MyExecuterService它自己,因此要访问此方法,您必须创建一个MyExecuterService对象。然后只有您可以访问该对象。现在由于MyExecuterService使用空参数构造函数创建对象而发生异常,因此未初始化数据成员。只需检查您调用the newFixedThreadPool(int i)方法的对象,并确保该对象是使用参数化构造函数创建的。顺便说一下,你的MyExecuterService类设计是一种假设。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python