编辑:
在完成您建议的所有更改后,问题仍然存在。调试器说lemma变量是null,但我应用的修复程序并没有让事情变得更好。因此,由于截止日期问题,我决定从另一个角度来解决问题。感谢大家的帮助。 :)
我正在写一个小程序而NullPointerException
让我发疯。我有两个班级:SystemDir
和Search
。第一个是初始目录和搜索引理的封装。 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]);
}
}
}
}
答案 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
中的 t
,subFiles
或subFiles[i]
为空。
答案 3 :(得分:0)
您的代码本身没有多大意义。
这使得很难发现错误。
我建议使用Eclipse调试器,并检查 WHICH 值为null
。
据我所知,你的问题是在SystemDir
的递归中,你没有提供代码。
答案 4 :(得分:0)
在searchFiles
方法中,在循环中启动线程的重点是什么?你想在每次执行循环时运行线程吗?我想你在这里遗漏了一些东西。
检查传递给构造函数的某些值是否为空。