Подтвердить что ты не робот

Исключение Java исключено

Почему некоторые исключения в Java не попадают под catch (Exception ex)? Это код полностью не работает с необработанным исключением. (Версия Java версии 1.4).

public static void main(String[] args) {
    try {
        //Code ...
    } catch (Exception ex) {
        System.err.println("Caught Exception");
        ex.printStackTrace();
        exitCode = app.FAILURE_EXIT_CODE;
    }
    finally {
        app.shutdown();
    }
    System.exit(exitCode);
}

Я получаю Exception in thread "main" java.lang.NoSuchMethodError

Но это работает

public static void main(String[] args) {
    int exitCode = app.SUCCESS_EXIT_CODE;
    try {
        //Code ...
    } catch (java.lang.NoSuchMethodError mex){
        System.err.println("Caught NoSuchMethodError");
        mex.printStackTrace();
        exitCode = app.FAILURE_EXIT_CODE;
    } catch (Exception ex) {
        System.err.println("Caught Exception");
        ex.printStackTrace();
        exitCode = app.FAILURE_EXIT_CODE;
    }
    finally {
        app.shutdown();
    }
    System.exit(exitCode);
}

Я получаю Caught NoSuchMethodError java.lang.NoSuchMethodError:

Я думал, что перехватывание исключений поймает все исключения? Как я могу уловить все исключения в java?

4b9b3361

Ответ 1

Потому что некоторые исключения не вытекают из Exception - например. Throwable и Error.

В принципе иерархия типов:

       Object
         |
      Throwable
     /         \
Exception      Error

Только теги Throwables и производные классы могут быть выброшены, поэтому, если вы поймаете Throwable, это действительно поймает все.

Любое исключение, происходящее из Exception (или Exception непосредственно), отличное от тех, которые получены из RuntimeException, считается как проверенные исключения - это те, которые вы должны объявить, вы будете бросать или ловить, если вы вызываете то, что их бросает.

Все сказано, что иерархия исключений Java - это немного беспорядок...

Ответ 2

Error не Exception с.

Класс Exception и его подклассы являются формой Throwable, которая указывает условия, при которых разумные приложение может захотеть поймать.

- JavaDoc для java.lang.Exception

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

- JavaDoc для java.lang.Error

Есть определенные ошибки, которые вы можете захотеть поймать, например ThreadDeath. ThreadDeath классифицируется как Ошибка, как описано ниже

Класс ThreadDeath специально подкласс Error, а не Исключение, хотя это "нормальный появление", поскольку многие приложения улавливать все случаи Исключения и затем отмените исключение.

- JavaDoc для ThreadDeath

Однако, поскольку метод Thread stop() теперь устарел, вы не должны его использовать, и поэтому вы никогда не должны видеть ThreadDeath.

Ответ 3

Исключение - это всего лишь один вид Throwable; NoSuchMethodError не исключение, а ошибка, которая является другим типом Throwable.

Ответ 4

Вы можете поймать Throwable. Ошибка и исключение расширяются Throwable.

см. Throwable JavaDoc:

Класс Throwable является суперклассом всех ошибок и исключений на языке Java.

Ответ 5

Как отмечали другие плакаты, не все бросающиеся объекты являются подклассами Exception. Однако в большинстве случаев не рекомендуется ловить Error или Throwable, потому что эти условия включают некоторые действительно серьезные условия ошибки, от которых невозможно легко восстановить. Ваш код восстановления может только ухудшить ситуацию.

Ответ 6

Как отмечают оба других сообщения, catch (Exception e) будет работать только для исключений, которые происходят из Exception. Однако, если вы посмотрите на иерархию дерева, вы заметите, что исключение, если Throwable. Throwable также является базовым классом для Error. Таким образом, в случае NoSuchMethodError это ошибка, а не исключение. Обратите внимание на соглашение об именах * Ошибка против * Исключение (например, в IOException).