如何捕获java.lang.NoClassDefFoundError?

我做了一个应用程序,它采用elf file(*.a和*.o)并给出方法名称列表,但是如果有人将任何文件重命名为*.a或*.o,那么它将显示:

Exception occurred during event dispatching:
java.lang.NoClassDefFoundError: org/eclipse/core/resources/IWorkspaceRunnable
    at org.eclipse.cdt.utils.AR.<init>(AR.java:237)
    at com.lge.windowELF.ElfBinaryArchive.<init>(ElfBinaryArchive.java:24)
    at com.lge.windowELF.ELFParserLibraryFile.createBinaryArchive(ELFParserLibraryFile.java:230)
    at com.lge.windowELF.ELFParserLibraryFile.<init>(ELFParserLibraryFile.java:46)
    at com.lge.windowELF.ELFWrapper.<init>(ELFWrapper.java:36)
    at com.lge.windowELF.ELF_UIIntegrated.actionPerformed(ELF_UIIntegrated.java:510)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)

在这种情况下,我想给出一些警告消息。此异常不会被 try/catch 捕获。


答案 1

NoClassDefFoundError是 的子类,而不是 .因此,您需要使用:ErrorException

try {
  new org.eclipse.cdt.utils.AR();
}
catch(NoClassDefFoundError e) {
  //handle carefully
}

在代码中。请注意,您永远不应该捕获 或 .还要确保用此代码括起来尽可能少,因为此异常通常不应通过捕获来执行。ErrorThrowablecatch

更新:另外,您确定要捕获此异常吗?这是非常罕见的,我无法想象你想如何处理它。也许你应该在CLASSPATH中添加一个带有类的JAR?IWorkspaceRunnable


答案 2

不鼓励捕获错误!JavaDoc 指出:

An 是 Throwable 的一个子类,它指示合理的应用程序不应尝试捕获的严重问题。Error

我的建议是,你整理并担心代码引发的异常。NoClassDefFoundError

我宁愿在代码中,当构造函数类尝试打开ELF文件时,对构造函数类(或包装类并在实例化时执行a)进行(有根据的猜测)。这样,如果存在无效的 ELF 文件,则会引发一个体面的异常。InvalidELFFileExceptionElfBinaryArchivethrows

或者,确保必须放在 CLASSPATH 中。org.eclipse.core.resources.IWorkspaceRunnable


推荐