1

编辑:

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

我正在编写一个小程序,并且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]);                    
            }
        }
    }
}
4

5 回答 5

3

通常,永远不要从构造函数启动线程。它可能会产生各种问题,这可能是您遇到异常的原因。

像在构造函数中一样创建线程,searchFiles公开并从客户端代码调用该方法,而不是从构造函数。

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

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

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

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

于 2012-09-18T17:55:45.860 回答
2

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

更具体地说,可能new Search(...)SystemDir 的构造函数中某处的表达式正在传递nullfor subFiles。是否有一个电话到File.list()某个地方,您可能没有检查是否有空返回?请注意,list()如果它根本无法列出目录,则返回 null,因为从缺少权限到未找到目录。


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

于 2012-09-18T18:02:41.800 回答
0

您尚未包含所有代码。

根据提供的信息:

在,searchFiles或中为空。tsubFilessubFiles[i]

于 2012-09-18T17:41:58.510 回答
0

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

这使得很难发现错误。

我建议使用 Eclipse 调试器,并检查WHICH值是null.

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

于 2012-09-18T17:55:50.773 回答
0

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

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

于 2012-09-18T17:59:23.850 回答