我在USB记忆棒上有一个Java应用程序以及JRE(每个Windows,Mac OSX和Linux一个),因此即使没有安装Java,它也可以在任何系统上运行。我有一个线程运行来检测USB棒是否被移除,如果它是退出应用程序。
我希望它在退出之前显示一条消息(或告诉他们重新插入驱动器),但是如果我试图显示一个JOptionPane,我会得到NoClassDefFoundError,因为JRE已经与USB一起删除了。
有没有办法将所需的类保留在内存中,以便Java不会尝试从不再存在的文件系统加载它们?
谢谢!
答案 0 :(得分:3)
对于大多数运行时,任何加载的类都将存放在RAM的Java内存的PermGen部分中。
在我看来,可能发生的事情是显示错误需要之前尚未加载的类 - 这些类仅在不再存在的驱动器上可用。
您可以通过在程序启动时触发错误显示逻辑来解决此问题,除非将其置于无形显示的模式中。这应该使用相同的代码路径,以便加载所有必需的类,并确保在需要显示错误时已知它们。如果这太困难了,你可以手动调用Class.forName("javax.swing.JOptionPane")
(对于每个所需的类),尽管如果你更改渲染代码而不更新要加载的硬编码类,这会更脆弱并且可能会中断。 / p>
如果不是的情况(即先前已经加载了所有必需的类,并且您仍然遇到问题)那么运行时显然正在卸载类。你必须查看它的文档,看看它在这里做了什么,以及如何阻止它。