如何捕获java.lang.NoClassDefFoundError?

时间:2011-11-16 12:33:20

标签: java exception-handling classnotfoundexception

我创建了一个应用程序,它接受elf文件(* .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没有捕获此异常。

2 个答案:

答案 0 :(得分:53)

NoClassDefFoundErrorError的子类,而不是Exception。因此,您需要使用:

try {
  new org.eclipse.cdt.utils.AR();
}
catch(NoClassDefFoundError e) {
  //handle carefully
}
你的代码中的

。请注意,您不应该抓住ErrorThrowable。另外,请确保使用此catch尽可能少地包含代码,因为此异常通常不会被捕获。

更新:您确定要捕获此异常吗?这是非常罕见的,我无法想象你想如何处理它。也许您应该只将IWorkspaceRunnable类的JAR添加到CLASSPATH?

答案 1 :(得分:4)

不鼓励抓住Error! JavaDoc声明:

  

Error是Throwable的子类,表示严重问题   合理的应用程序不应该试图抓住。

我的建议是你整理NoClassDefFoundError并担心代码抛出的异常。

我宁愿在代码中,在InvalidELFFileException构造函数类上抛出ElfBinaryArchive(有根据的猜测)(或在实例化时包装类并执行throws)打开ELF文件。这样,如果有一个无效的ELF文件,就会抛出一个不错的异常。

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