我在 USB 内存棒上有一个 Java 应用程序以及 JRE(Windows、Mac OSX 和 Linux 各一个),因此即使未安装 Java,它也可以在任何系统上运行。我有一个线程正在运行以检测 USB 内存棒是否已移除,如果是,它会退出应用程序。
我想让它在退出前显示一条消息(或告诉他们重新插入驱动器),但如果我尝试显示 JOptionPane,我会收到 NoClassDefFoundError,因为 JRE 已与 USB 一起被移除。
有没有办法将所需的类保存在内存中,以便 Java 不会尝试从不再存在的文件系统中加载它们?
谢谢!
最佳答案
对于大多数运行时,加载的任何类将在 RAM 中,在 Java 内存的 PermGen 部分。
在我看来,可能发生的情况是显示错误需要以前未加载的类 - 这些类仅在不再存在的驱动器上可用。
您可以通过在程序启动时触发错误显示逻辑来解决此问题,除非它处于不可见显示的模式。这应该使用相同的代码路径,以便加载所有必需的类,并确保在需要显示错误时已知它们。如果这太难了,您可以改为手动调用 Class.forName("javax.swing.JOptionPane")
(对于每个需要的类),尽管这更脆弱并且如果您更改可能会损坏您的渲染代码无需更新要加载的硬编码类。
如果不是这种情况(即之前已加载所有必需的类,但问题仍然存在)那么您的运行时显然正在卸载类。您必须查看它的文档才能了解它在这里做了什么,以及如何停止它。
关于java - 当 Java 运行时位于可移动驱动器上时如何防止 NoClassDefFoundError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9214643/