【问题标题】:NullPointer Exception using Thread.join on multiple threads在多个线程上使用 Thread.join 的 NullPointer 异常
【发布时间】:2011-05-09 12:25:26
【问题描述】:

我的一个 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("...");
    }
}

有人知道为什么会出现这个异常吗?

【问题讨论】:

  • 我看不到您如何/何时设置i。那是怎么回事?
  • 嗨,鲍比,你是对的。当然我有一个变量'i',但我刚刚看到它在我的第一个循环中没有增加。因此,我在第二个期间得到了空指针异常。谢谢你的评论:)

标签: java multithreading


【解决方案1】:

确保第一个循环中的所有i 涵盖myRootManagers 数组中的所有有效缺陷。

请注意,您应该在第一个 for 循环的 end 中增加 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 引用。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      如果在另一个线程中删除了 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.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-02
        • 2020-01-25
        • 1970-01-01
        • 2018-05-30
        • 2012-06-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多