簡體   English   中英

在多個線程上使用Thread.join的NullPointer異常

[英]NullPointer Exception using Thread.join on multiple threads

我的一個Java程序出現以下問題。 我正在嘗試啟動多個線程,具體取決於我的主程序在文件系統上找到的內容。 它的工作方式非常經典:-第一個循環:實例化,存儲在本地數組中並啟動新線程-第二個循環:使用'.join()'方法等待所有線程

執行時,我在'.join()'上得到了一個N​​ullPointerException。 此異常由啟動的第三個線程引發(因為它在第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("...");
    }
}

有人知道為什么會發生這種異常嗎?

確保第一個循環中的所有i都覆蓋myRootManagers數組中的所有有效指標。

請注意,您應該在第一個for循環的末尾增加i ,因為數組索引基於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引用。

除非您隱藏了重要部分,否則這對我來說似乎很奇怪:

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

您遍歷myCCDirs但初始化了myRootManagers對象,也許您沒有增加i

如果在另一個線程中刪除了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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM