【问题标题】:NullPointerException on first thread第一个线程上的 NullPointerException
【发布时间】:2012-09-18 17:31:55
【问题描述】:

编辑:

按照您的建议进行所有更改后,问题仍然存在。调试器说引理变量为空,但我应用的修复并没有让事情变得更好。所以,由于截止日期的问题,我决定从另一个角度来解决这个问题。谢谢大家的帮助。 :)

我正在编写一个小程序,NullPointerException 让我发疯。我有两个班级:SystemDirSearch。第一个只是初始目录和搜索引理的封装。 Search 类如下所示。简而言之,我希望一个线程搜索第一级目录,另一个线程扩展子目录。这就是我得到异常的地方。异常字符串是

Exception in thread "Thread-0" java.lang.NullPointerException
at Search.searchFiles(Search.java:59)
at Search.<init>(Search.java:53)
at SystemDir.<init>(SystemDir.java:61)
at Search$1.run(Search.java:45)
at java.lang.Thread.run(Thread.java:679)

其中 3 个点是最终循环内的 t.start()、searchFiles 方法调用、上面的一些行以及 run 方法中的新 SystemDir 调用。你能帮帮我吗?

public class Search {
   private Thread t;

   public Search(String[] subFiles, final String[] subDir, final String lemma) {
       t = new Thread(new Runnable() {
           @Override
           public void run() {
               for(int i=0;i<subDir.length;i++) {
                   try {
                       System.out.println(subDir[i]);
                       new SystemDir(subDir[i], lemma);
                   }
                   catch (NoDirectoryException ex) {
                       Logger.getLogger(Search.class.getName()).log(Level.SEVERE, null, ex);
                   }
               }
           }
       });

       searchFiles(subFiles,lemma); 
    }

    private void searchFiles(String[] subFiles, String lemma) {
       for(int i=0;i<subFiles.length;i++) {
            t.start();
            if(subFiles[i].contains(lemma)) {
                System.out.println(subFiles[i]);                    
            }
        }
    }
}

【问题讨论】:

  • 当您询问有关异常的问题时,请始终提供实际异常,即前几行,并指出行对应于异常行号。请编辑您的帖子以提供此信息。
  • 你能正确格式化你的代码吗?当你的压痕遍布地图时,真的很难理解。
  • SystemDir 构造函数中的问题
  • 你真的在循环中启动线程吗?你只能这样做一次对吗?您的意思是在数组中的每个元素上启动一个新线程吗?
  • 另外,我仍然不确定哪条线路在抛出 NPE。 t.start() 行?这没有任何意义。

标签: java multithreading nullpointerexception


【解决方案1】:

通常,never start a thread from a constructor。它可能会产生各种问题,这可能是导致您遇到异常的原因。

像在构造函数中一样创建线程,将 searchFiles 设为 public,然后从客户端代码而不是构造函数调用该方法。

除此之外,您是否检查过:

  • subFiles 不为空
  • subFiles[i] 中没有一个为空
  • lemma 不为空

(如有必要,添加 println 语句)

正如@Gray 所指出的,你不能多次启动一个线程。

【讨论】:

  • 我会尝试修复,并返回消息 :)
【解决方案2】:

您未能发布SystemDir 的源代码,但堆栈跟踪显示,除了创建线程的对象之外,它的构造函数还试图创建一个 Search 对象首先。

更具体地说,可能 SystemDir 的构造函数中某处的new Search(...) 表达式将null 传递给subFiles。是否有对 File.list() 的调用,您可能没有检查是否有空返回?请注意,list() 如果由于从缺少权限到未找到目录等原因而根本无法列出目录,则返回 null。


此外,您似乎多次尝试启动同一个线程对象。如果subFiles 中有多个元素,这将导致IllegalThreadStateException

【讨论】:

  • 是的,你在“list() 返回空的东西”上有一点。我将在下午发布 SystemDir 源代码。 :)
【解决方案3】:

你还没有包含所有的代码。

根据提供的信息:

searchFiles 中,tsubFilessubFiles[i] 为空。

【讨论】:

    【解决方案4】:

    您的代码本身没有多大意义。

    这使得发现错误变得困难。

    我推荐使用 Eclipse 调试器,并检查 WHICH 值是null

    据我所知,您的问题在递归到 SystemDir 中,您没有提供代码。

    【讨论】:

      【解决方案5】:

      在您的searchFiles 方法中,在循环中启动线程有什么意义?您想在每次执行循环时运行线程吗?我认为你在这里遗漏了一些东西。

      检查您传递给构造函数的某些值是否为空。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-06
        • 2016-03-21
        • 1970-01-01
        • 2015-01-09
        相关资源
        最近更新 更多