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