Как поймать 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.

Ответ 1

Это не рекомендуется, чтобы поймать Error! Состояние JavaDoc:

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

Мое предложение состоит в том, что вы сортируете NoClassDefFoundError и беспокоитесь об исключениях, которые вы выбрали вместо кода.

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

Кроме того, убедитесь, что org.eclipse.core.resources.IWorkspaceRunnable должен быть помещен в CLASSPATH.

Ответ 2

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

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

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

UPDATE: Также вы уверены, что хотите поймать это исключение? Это очень редко, и я не могу представить, как вы хотите справиться с этим. Может быть, вы должны просто добавить JAR с классом IWorkspaceRunnable в свой CLASSPATH?