Как поймать java.lang.NoClassDefFoundError? - PullRequest
15 голосов
/ 16 ноября 2011

Я сделал приложение, которое берет файл 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 ]

54 голосов
/ 16 ноября 2011

NoClassDefFoundError является подклассом Error, а не Exception.Следовательно, вам нужно использовать:

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

в вашем коде.Обратите внимание, что вы никогда не должны ловить Error или Throwable.Также убедитесь, что этот catch окружает как можно меньше кода, поскольку это исключение обычно не должно быть перехвачено.

ОБНОВЛЕНИЕ: Также вы уверены, что хотите перехватить это исключение?Это очень редко, и я не могу представить, как вы хотите справиться с этим.Может быть, вам следует просто добавить JAR с классом IWorkspaceRunnable в CLASSPATH?

4 голосов
/ 16 ноября 2011

Это не рекомендуется поймать Error!JavaDoc заявляет:

Error - это подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться отловить.

Я предлагаю вам разобраться с NoClassDefFoundError и беспокоиться об исключениях, которые выдает ваш код.

Я бы предпочел, в коде, бросить InvalidELFFileException (обоснованное предположение) на класс конструктора ElfBinaryArchive (или оберните класс и выполните throws при создании экземпляра), когда класс попытается открыть файл ELF.Таким образом, если существует недопустимый файл ELF, выдается достойное исключение.

В качестве альтернативы, убедитесь, что org.eclipse.core.resources.IWorkspaceRunnable должно быть указано в CLASSPATH.

...