【问题标题】:1/10 times java crashes on JFileChooser.showOpenDialog1/10 次 java 在 JFileChooser.showOpenDialog 上崩溃
【发布时间】:2025-11-28 21:15:01
【问题描述】:

不可重现的崩溃(无错误/异常)。 当我运行一个对话框以仅 10 次选择一个文件夹时发生。代码:

public String getFilePathFromDialog(String dialogTitle) {
    JFileChooser fileChooser;
    fileChooser = new JFileChooser();
    fileChooser.setDialogTitle(dialogTitle);
    fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
    fileChooser.setAcceptAllFileFilterUsed(true);
    if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
        return fileChooser.getSelectedFile().toString();
    } else {
        return "";
    }
}

它使我的应用程序崩溃。在此之后,我只能通过以下方式关闭它: Ctrl+Alt+Delete -> 任务管理器 -> 杀死它 -> 然后我得到“Java(TM) Platform SE 二进制文件没有响应” 然后我点击关闭按钮

我做错了什么还是一个错误?

我找到了下面提到的 Peter 的故障转储文件。这是其中的一部分:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x62a5ff52, pid=5516, tid=5312
#
# Problematic frame:
# C  [nvd3dum.dll+0x2fff52]
#
Current thread (0x04323400):  JavaThread "AWT-Windows" daemon [_thread_in_native, id=5312, stack(0x04d60000,0x04db0000)]
siginfo: ExceptionCode=0xc0000005, writing address 0x04ee9004

【问题讨论】:

  • 如果它正在崩溃,您应该在应用程序的默认工作目录中获得崩溃转储。有关更多详细信息,请参阅此链接*.com/questions/1880166/…您在使用 Java 6 更新 23 吗?
  • 您是否在该计算机上映射了网络驱动器? Java 可能会尝试从这些网络驱动器中读取以在对话框中列出它们。当网络由于某种原因变慢或暂时无法访问时,这可能会使您的程序似乎挂起一段时间。
  • 我确实有很多网络驱动器。也许与此有关。但它并没有放慢速度,而是完全崩溃了。它要么立即启动,要么永远崩溃。不管怎么说,还是要谢谢你。好点子。我将桌面设置为 CurrentDirectory (启动对话框的默认目录),我认为它不再这样做了。所以你的评论很有用。
  • 彼得,我正在使用:NetBeans 6.8,Java 1.6.0_17。我找到了故障转储文件并将其添加到我的问题中

标签: java crash openfiledialog jfilechooser


【解决方案1】:
# Problematic frame:
# C  [nvd3dum.dll+0x2fff52]

那将是您的 NVidia 视频驱动程序?

请注意,这不是在 AWT EDT 线程上,而是在内部系统线程上。您可以尝试禁用 Direct Draw 3D(有一些系统属性可以做到这一点)。

【讨论】:

  • 我用谷歌搜索了特定的 dll +“Java 错误”,他们在论坛上说这是一个在 1.6.0_21 中解决的错误。我会更新并希望它不再出现。
【解决方案2】:

当 JVM 运行的非常接近操作系统分配给它的最大内存时,我在 Windows 上看到过类似的情况。然后用户打开一个对话框,可能是在网络驱动器上,这会加载一些额外的操作系统资源(可能是 DLL),然后 JVM 耗尽内存(不是堆,而是分配给 JVM 本身的内存)然后崩溃。

【讨论】:

    【解决方案3】:

    确保在 EDT 上调用代码。

    另外,只是一个观察(与崩溃无关),最好声明变量fileChooser并在同一语句中赋值(不变性):

    final JFileChooser fileChooser = new JFileChooser();
    

    【讨论】:

    • +1 用于检查EDT
    • 这不是线程问题。从 EDT 外部调用不会使 JVM 崩溃。和 -1 到“+1 用于检查 EDT”评论。