java - "AWT-EventQueue-0"中的异常

标签 java swing thread-safety

我提前对这个问题表示歉意,因为这个问题可能很难解释,但我试图包含最少的必要信息(我怀疑你想阅读 10 个不同的类来查找错误)

我一直在用java制作一个简单的应用程序,使用swing作为GUI。目前我有一个 JTable、JList 和一个 JButton。在表中双击时,会将其添加到列表中。单击按钮时,自定义的 fileVisitor 会遍历(当前硬编码的)目录,并用它找到的文件填充表。到目前为止,该列表没有任何作用。这一切都按预期进行。

但是,当单击该按钮时,整个应用程序将锁定大约 15 秒,文件访问器需要运行大约 15 秒。如果有点刺激的话也没关系。当文件树遍历结束时,应用程序再次响应(表会立即更新所有行)。

所以我决定将 Files.walkFileTree 调用放在它自己的线程中。起初这似乎是有效的,因为每个文件都被添加到表模型中,它反射(reflect)在表中(设置为在模型更改时调用重新验证)。但是,如果我在文件树遍历过程中双击某个项目,它将挂起并显示消息: java.lang.NullPointerException 从线程“AWT-EventQueue-0”中的 UncaughtExceptionHandler 抛出

在阅读了一些关于 swing 的内容后,我认为这是因为我从不是 AWT 调度线程的线程编辑了表模型,并立即将编辑表模型的行放入 SwingUtilities.invokeLater(Runnable) block 中。然而,这并没有解决问题。奇怪的是(或者可能不是,这对我来说似乎很奇怪),有时双击会起作用,并且只有在 2 或 3 次尝试后才会导致崩溃。

我的问题是:是什么原因造成的?我看不出任何其他明显错误,我所有的谷歌搜索都指向 Swings 缺乏线程安全性,并使用 AWT 调度线程(我认为这是 invokeLater 所做的)。有谁知道出了什么问题吗?

附注如果有任何不清楚的地方,并且太长了,再次抱歉:P

最佳答案

事实证明存在两个问题: 1)我使用线程来进行文件树遍历,而不是使用 Swing Worker doInBackground; 2)我的双击代码实际上产生了一个空指针,但只有当你在表更新时得到正确的时机时,我现在也修复了这个问题。感谢您的关注。

关于java - "AWT-EventQueue-0"中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7541851/

相关文章:

java - 包含一些数据的未同步 Collection 对象,需要同步包装器,但不希望引用原始对象

Java、swing、JFrame 和 JPanel

java - 添加同一按钮的多个实例

java - 如何正确等待对象被实例化

python线程安全的可变对象副本

java - 如何通过网络发送消息?

java - Systemd: '_JAVA_OPTIONS' 节中的未知左值 'Service'

java - 在调用父类(super class)型构造函数之前无法引用 PublicationDate

java - 如何判断按钮数组中的哪个按钮被单击?

ruby-on-rails - 带有事件记录的 Rails 控制台中的线程在数据库中找不到模型