我的一个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("...");
}
}
有人知道为什么会发生此异常吗?
答案 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.