我有一个小型的java程序,使用WindowBuilder在Eclipse中编写,该程序用于从UTF-8文本文件中读取数据并将其写入数据库。为了保持GUI的响应能力,我使用了一个swing工作线程,在单击按钮时执行。
btnex.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
worker = new SwingWorker<Void, Void>() {
public Void doInBackground() {
String[] content = Reader.getContent(file);
//do something with the content, if something goes wrong, set error to true.
return null;
}
public void done() {
if (!error) {
//handle error
}
};
worker.execute();
类Reader中的函数getContent将文件中的数据提取到字符串数组中。
public static String[] getContent (String dbfile) {
try {
String[] lines = null;
String[] linesplit = null;
String store = "";
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(dbfile), "UTF8"));
String line = "";
line = reader.readLine();
linesplit = line.split(";");
while (linesplit.length > 1 && !line.equals(null)) {
for (int i = 0; i < linesplit.size(); i++) {
store += StringFormer.decrypt(linesplit[i]) + " ";
} //StringFormer is another class written by me, just for decrypting the string
store += "\n";
line = reader.readLine();
if (line.equals(null)) break;
linesplit = line.split(";");
}
reader.close();
lines = store.split("\n");
return lines;
} catch (Exception ex) { //...
}
}
当我尝试运行程序并单击按钮时,程序无法正常运行。所以我在调试模式下运行程序,因此,thead没有完成,但在完成所有工作之前以某种方式退出。这在getContent中发生,在离开while循环之后但在处理reader.close()之前。在离开while循环之前,调试视图中的调用堆栈包含按钮单击和getContent的调用,旁边是其他调用,但是一旦我离开循环,上面提到的两个被删除,下一个顶层堆栈成员命名为base swing worker class:SwingWorker $ 2(FutureTask).run。
有谁知道,为什么程序没有完成书面工作流程?我在程序中使用多个线程,但是从来没有两个后台线程同时运行。
答案 0 :(得分:0)
我自己找到了答案: 行if(line.equals(null)抛出NullPointerException。当没有更多内容可以从文件中读出时,line为null,但是函数equals需要定义比较变量。由于line为null,equals抛出异常而没有我注意到它。该行必须是if(line == null)。