由于未初始化的外部成员变量,下面的代码抛出空指针异常。它在 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
没有被初始化。
您MyExecuterService
在new FixedThreadPool(int i)
方法中使用参数创建了对象,但由于此方法属于MyExecuterService
它自己,因此要访问此方法,您必须创建一个MyExecuterService
对象。然后只有您可以访问该对象。
现在由于MyExecuterService
使用空参数构造函数创建对象而发生异常,因此未初始化数据成员。
只需检查您调用the newFixedThreadPool(int i)
方法的对象,并确保该对象是使用参数化构造函数创建的。
顺便说一下,你的MyExecuterService
类设计是一种假设。
添加回答
举报
0/150
提交
取消