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

时间:2018-08-05 18:52:36

标签: java inner-classes synchronized

下面的代码引发nullpointer异常由于未初始化的外部成员变量而导致。 它在可运行变量的运行方法中抛出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);
    }

    public void execute(Runnable runnable) {
        System.out.println(runnables.size());
        synchronized(runnables)
        {
            runnables.add(runnable);
            runnables.notify();
        }
    }
    public ConcurrentLinkedQueue<Runnable> getRunnables() {
        return runnables;
    }

    public void setRunnables(ConcurrentLinkedQueue<Runnable> runnables) {
        this.runnables = runnables;        
    }
}

1 个答案:

答案 0 :(得分:1)

NullPointerException是由于MyExecuterService的数据成员未初始化。

您在MyExecuterService方法中使用参数创建了new FixedThreadPool(int i)对象,但是由于此方法属于MyExecuterService本身,因此,要访问此方法,您必须创建一个{{1} }对象。 然后只有您可以访问该对象。

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

只需检查正在通过哪个对象调用MyExecuterService方法,并确保使用参数化构造函数创建该对象。

顺便说一句,您对the newFixedThreadPool(int i)类的设计是一种假设。