第一个线程上的NullPointerException

时间:2012-09-18 17:31:55

标签: java multithreading nullpointerexception

编辑:

在完成您建议的所有更改后,问题仍然存在。调试器说lemma变量是null,但我应用的修复程序并没有让事情变得更好。因此,由于截止日期问题,我决定从另一个角度来解决问题。感谢大家的帮助。 :)

我正在写一个小程序而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]);                    
            }
        }
    }
}

5 个答案:

答案 0 :(得分:3)

通常never start a thread from a constructor。它可以创建各种问题,这可能是你得到的例外的原因。

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

除此之外,你有没有检查过:

  • subFiles不为空
  • subFiles[i]均无效
  • lemma不为空

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

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

答案 1 :(得分:2)

您未能发布SystemDir的源代码,但堆栈跟踪显示其构造函数正在尝试创建 Search对象首先创建了线程。

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


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

答案 2 :(得分:0)

您尚未包含所有代码。

提供的信息:

searchFiles中的

tsubFilessubFiles[i]为空。

答案 3 :(得分:0)

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

这使得很难发现错误。

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

据我所知,你的问题是SystemDir 的递归中,你没有提供代码。

答案 4 :(得分:0)

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

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