如何捕获java.lang.NoClassDefFoundError?

Ash*_*ish 17 java exception-handling classnotfoundexception

我做内搭ELF文件的应用程序(*和*的.o.),并给出方法名称列表中,但如果有人重命名的任何文件到*某或*的.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)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我想给出一些警告信息.try/catch没有捕获此异常.

Tom*_*icz 55

NoClassDefFoundError是一个子类Error而不是一个Exception.因此你需要使用:

try {
  new org.eclipse.cdt.utils.AR();
}
catch(NoClassDefFoundError e) {
  //handle carefully
}
Run Code Online (Sandbox Code Playgroud)

在你的代码中.请注意,你不应该抓住ErrorThrowable.还要确保尽可能少地包含代码,catch因为此异常通常不会被捕获.

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

  • 这个答案要好得多,它应该是被接受的答案,因为它实际上真正回答了问题,同时有助于解决实际问题. (3认同)

Buh*_*ndi 5

不鼓励来捕捉Error!JavaDoc 指出:

AnError是 Throwable 的子类,表示合理的应用程序不应尝试捕获的严重问题。

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

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

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

  • 投反对票,因为 __should not__ 与 __must not__ 或 __never__ 不同,不应该意味着它被允许,只是不推荐。如果有人问“_我如何做某事?_”,通常说“_不要这样做_”是没有帮助的;我什至会认为这很粗鲁,即使您的回答可能有所帮助。 (26认同)
  • 我从来不知道我们会因为英语的使用而投反对票。我认为 SO 是基于编程相关的解决方案。如果这是基于英语,那么这篇文章不应该对英语 StackExchange 更有益吗?(参见[示例](http://english.stackexchange.com/questions/56065/must-not-or-may-not-which-is-the-most-correct))。 (5认同)
  • 一个用户问你怎么做某事,你告诉他他不会做,这就是你被否决的原因。你不应该这样做是__没有回答问题__。 (2认同)