JDK 1.7 Throwable `addSuppressed ()` метод

Я отвечал на связанные вопросы, я читал исходный код JDK 1.7, но не нашел ответа.

В этом вопросе я хочу полностью игнорировать fillInStackTrace .

Начиная с JDK 1.4 был добавлен метод initCause () . Например, когда вы используете отражение ядра для вызова метода, вы получаете исключение InvocationTargetException с причиной, в которой есть целевое исключение.

Когда я увидел эту функцию, я начал использовать ее также в подобном сценарии

    try {
        //contains some code that can throw new IOException();
    }
    catch(IOException e){
        throw new RuntimeException(e);
    }

Итак, я перехватил исключение, я не готов с ним справиться здесь, и я повторно генерирую новое исключение, где у меня есть исходное исключение, как причина. В некоторых сценариях используется не RuntimeException, а мое собственное исключение, поэтому иногда я также вызываю e.getCause () , чтобы правильно обработать это исключение во внешнем блоке.

Такова ситуация в версии до JDK 1.7. Почему и когда мне следует использовать addSuppressed () ? Следует ли мне изменить приведенный выше код на

    try {
        //contains some code that can throw new IOException();
    }
    catch(IOException e){
        RuntimeException re= new RuntimeException(e.getMessage());
        re.addSuppressed(e);
        throw re;
    }

И в качестве дополнительного вопроса, почему addSuppressed () не возвращает Throwable как initCause () , чтобы разрешить throw (RuntimeException) new RuntimeException (). InitCause (e); ? Например, почему я не могу этого сделать?:

    try {
        //contains some code that can throw new IOException();
    }
    catch(IOException e){
        throw (RuntimeException)new RuntimeException(e.getMessage()).addSuppressed(e);
    }

Я вынес ответ в отдельный пост.

14
задан Andrey Rubshtein 5 February 2012 в 23:41
поделиться