Java 第一个线程上的NullPointerException

Java 第一个线程上的NullPointerException,java,multithreading,nullpointerexception,Java,Multithreading,Nullpointerexception,编辑: 在做了您建议的所有更改后,问题仍然存在。调试器说lemma变量为null,但我应用的修复并没有使事情变得更好。因此,由于最后期限的问题,我决定从另一个角度来处理这个问题。谢谢大家的帮助。:) 我正在写一个小程序,一个NullPointerException让我发疯。我有两个类:SystemDir和Search。第一个是初始目录和搜索引理的封装。搜索类如下所示。简单地说,我希望一个线程搜索第一级目录,另一个线程扩展子目录。这就是我得到的例外。异常字符串为 Exception in thre

编辑:

在做了您建议的所有更改后,问题仍然存在。调试器说lemma变量为null,但我应用的修复并没有使事情变得更好。因此,由于最后期限的问题,我决定从另一个角度来处理这个问题。谢谢大家的帮助。:)

我正在写一个小程序,一个
NullPointerException
让我发疯。我有两个类:
SystemDir
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)
线程“thread-0”java.lang.NullPointerException中的异常 在Search.searchFiles(Search.java:59) 搜索时。(Search.java:53) 在SystemDir.(SystemDir.java:61) 搜索$1.run(Search.java:45) 运行(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]);                    
            }
        }
    }
}
公共类搜索{
私有线程t;
公共搜索(字符串[]子文件,最终字符串[]子文件,最终字符串引理){
t=新线程(新可运行(){
@凌驾
公开募捐{

对于(int i=0;i您没有包含所有代码

根据提供的信息:


searchFiles
中,
t
子文件
子文件[i]
为空。

您尚未包含所有代码

根据提供的信息:

searchFiles
中,
t
子文件
子文件[i]
为空。

通常,它会产生各种各样的问题,这些问题可能导致出现异常

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

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

  • 子文件
    不为空
  • 子文件[i]
    均不为空
  • 引理
    不为空
(必要时添加println语句)

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

通常,它会产生各种各样的问题,这可能是导致出现异常的原因

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

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

  • 子文件
    不为空
  • 子文件[i]
    均不为空
  • 引理
    不为空
(必要时添加println语句)


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

你的代码本身没有多大意义

这使得很难发现错误

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


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

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

这使得很难发现错误

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


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

searchFiles
方法中,在循环中启动线程的意义是什么?是否希望在每次执行循环时运行线程?我认为您缺少了一些东西


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

在您的
searchFiles
方法中,在循环中启动线程的意义是什么?是否要在每次执行循环时运行线程?我认为您缺少了一些内容


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

您未能发布
SystemDir
的源代码,但堆栈跟踪表明其构造函数正在尝试创建一个新的
搜索对象,而不是最初创建线程的对象

更具体地说,SystemDir构造函数中某个地方的
新搜索(…)
表达式可能正在为
子文件传递
null
。是否有对
File.list()
的调用,您可能还没有检查其是否返回空值?请注意
list()
如果由于缺少权限或找不到目录等原因而无法列出目录,则返回null



此外,您似乎多次尝试启动同一个线程对象。如果
子文件中有多个元素,则会导致
非法线程状态异常
您未能发布
SystemDir
的源代码,但堆栈跟踪显示其构造函数正在尝试创建在最初创建线程的对象之外,再创建一个新的
搜索
对象

更具体地说,SystemDir构造函数中某个地方的
新搜索(…)
表达式可能正在为
子文件传递
null
。是否有对
File.list()
的调用,您可能还没有检查其是否返回空值?请注意
list()
如果由于缺少权限或找不到目录等原因而无法列出目录,则返回null


此外,您似乎多次尝试启动同一个线程对象。如果存在多个元素,则会导致
IllegalThreadStateException