0

これは私が持っているコードです。コンストラクターの最後の行で Null Pointer Exception が発生しました (workerQueue[i] = new LinkedBlockingQueue(100);):

public class QueueThreadPool {

  private BlockingQueue<String>[] workerQueue;
  private Thread[] workerThreads;
  private int numQueues;
  private int numThreads;

public QueueThreadPool(int numThreads, int numQueues) {
    this.numQueues = numQueues;
    this.numThreads = numThreads;

    for(int i=1; i<=numQueues; i++){
        workerQueue[i] = new LinkedBlockingQueue<String>(100);
    }
}
public static void main(String args[]){
    System.out.println("Start...");
    new QueueThreadPool(50, 11);
    System.out.println("End...");
}

助けてください!ありがとう!!

4

3 に答える 3

2

workerQueueあなたがする必要がある配列はインスタンス化されていません。

private BlockingQueue<String>[] workerQueue;

workerQueueBlockingQueue<String>[]オブジェクトではなく、型の参照です。

しかし、のジェネリック配列を作成することもできませんBlockingQueue<String>。その代わりに of を作成しListますBlockingQueue<String>。元 -

private List<BlockingQueue<String>> workerQueue= new ArrayList<>();

コンストラクターでリスト オブジェクトを作成することもできます。

private List<BlockingQueue<String>> workerQueue= new ArrayList<>();
public QueueThreadPool(int numThreads, int numQueues) {
    this.workerQueue = new ArrayList<>(numQueues);  // <-- initialize the field.
    this.numQueues = numQueues;
    this.numThreads = numThreads;
    ...
于 2013-07-23T04:14:08.020 に答える
0

コードの 2 つの問題: フィールドを初期化する必要があり、ループは 0 から配列サイズ - 1 に移動する必要があります。修正されたコードは次のようになります。

public class QueueThreadPool {

  private BlockingQueue<String>[] workerQueue;
  private Thread[] workerThreads;
  private int numQueues;
  private int numThreads;

public QueueThreadPool(int numThreads, int numQueues) {
    this.workerQueue = new BlockingQueue<String>[numQueues]  // <-- You need to initialize the field.
    this.numQueues = numQueues;
    this.numThreads = numThreads;

    for(int i=0; i < numQueues; i++){  // <-- Indexing into arrays goes from 0 to size-1     (inclusive).
        workerQueue[i] = new LinkedBlockingQueue<String>(100);
    }
}
于 2013-07-23T04:18:50.110 に答える
0

を初期化していませんworkerThreads。次のようなことをしなければなりませんworkerQueue= new BlockingQueue<String>[numQueues];

于 2013-07-23T04:14:54.743 に答える