NullPointer在多个线程上使用Thread.join的异常

时间:2011-05-09 12:25:27

标签: java multithreading

我的一个Java程序存在以下问题。 我正在尝试启动多个线程,具体取决于我的主程序在文件系统上找到的内容。 它的工作方式非常经典: - 第一个循环:实例化,存储在本地数组中并启动一个新线程 - 第二个循环:使用'.join()'方法等待所有线程

执行时,我在'.join()'上得到一个NullPointerException。启动的第3个线程抛出此异常(因为它在2个第一个线程之前完成)

这是我的代码示例:

PackageManager[] myRootManagers = new PackageManager[myCCDirs.size()];
int i = 0;
for (PkgDescriptor descriptor : myCCDirs) {
    ...
    // --- instantiate new ROOT manager
    myRootManagers[i] = new PackageManager(getConfig(), loggerPac, descriptor);
    // --- start it
    myRootManagers[i].start();
}

for (PackageManager packageManager : myRootManagers) {
    try {
        packageManager.join();
    }
    catch (InterruptedException e) {
        loggerPac.error("...");
    }
}

有人知道为什么会发生此异常吗?

3 个答案:

答案 0 :(得分:4)

确保第一个循环中的所有i都涵盖myRootManagers数组中的所有有效内容。

请注意,您应该在第一个for循环的 end 中增加i,因为数组indecies是从0开始的。:

int i = 0;
for (PkgDescriptor descriptor : myCCDirs) {
    ...
    // --- instantiate new ROOT manager
    myRootManagers[i] = new PackageManager(getConfig(), loggerPac, descriptor);
    // --- start it
    myRootManagers[i].start();

    i++;   // <-----------------------------------
}

作为调试步骤,我会添加

System.out.println(Arrays.toString(myRootManagers));

在第一个循环之后,断言没有null个引用。

答案 1 :(得分:1)

除非你隐藏了重要的部分,否则这对我来说似乎很奇怪:

for (PkgDescriptor descriptor : myCCDirs) {
    ...
    // --- instantiate new ROOT manager
    myRootManagers[i] = new PackageManager(getConfig(), loggerPac, descriptor);
    // --- start it
    myRootManagers[i].start();
}

你迭代myCCDirs但是初始化myRootManagers个对象,也许你没有增加i

答案 2 :(得分:1)

如果在另一个帖子中删除了myCCDirs,也会发生这种情况。

PackageManager[] myRootManagers = new PackageManager[myCCDirs.size()]; // size is 3
int i = 0;
for (PkgDescriptor descriptor : myCCDirs) { // size is now 2 so the last field is not set.