web-dev-qa-db-ja.com

Java.lang.NoClassDefFoundErrorをキャッチする方法は?

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ではキャッチされません。

17
Ashish

Error をキャッチすることは推奨されていません! JavaDocの状態:

ErrorはThrowableのサブクラスであり、妥当なアプリケーションがキャッチしようとしてはならない重大な問題を示します。

私の提案は、NoClassDefFoundErrorを整理し、代わりにコードによってスローされる例外について心配することです。

むしろ、コードでは、クラスがしようとしたときに、InvalidELFFileExceptionコンストラクタークラスにElfBinaryArchive(知識に基づいた推測)をスローします(または、クラスをラップして、インスタンス化するときにthrowsを実行します)。 ELFファイルを開きます。そうすれば、無効なELFファイルがある場合、適切な例外がスローされます。

または、org.Eclipse.core.resources.IWorkspaceRunnableはCLASSPATHに入れる必要があります。

4
Buhake Sindi

NoClassDefFoundErrorErrorのサブクラスであり、Exceptionではありません。したがって、以下を使用する必要があります。

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

あなたのコードで。 ErrorまたはThrowableをキャッチしてはいけないことに注意してください。また、この例外は通常キャッチされるべきではないため、このcatchでできるだけ少ないコードを囲むようにしてください。

更新:また、この例外をキャッチしてもよろしいですか?それは非常にまれであり、あなたがそれをどのように扱いたいか想像できません。たぶん、IWorkspaceRunnableクラスのJARをCLASSPATHに追加する必要がありますか?

56