Заменить проверенное исключение на исключение времени выполнения?

Учитывая, что я в основном хочу исключить использование проверенных исключений и преобразовать их в исключения времени выполнения, я обычно делаю что-то вроде этого:

try {
    file.read();
} catch (IOException e){
    throw new RuntimeException(e); 
}

У этого есть несколько недостатков, но больше всего меня раздражает то, что мое исключение во время выполнения будет содержать вложенную трассировку стека. По сути, я хотел бы повторно выбросить & quot; IOException & quot; как RuntimeException (или «IORuntimeException») с исходным сообщением и трассировкой стека, так что я могу избежать бесполезной вложенной трассировки стека. «Факт» то, что я снова выбросил исключение где-то посередине, кажется мне просто бесполезным шумом.

Это возможно ? Есть ли библиотека, которая делает это?

Ответы на вопрос(6)

Начиная с Java 8, существует другой способ:

try {
  // some code that can throw both checked and runtime exception
} catch (Exception e) {
  throw rethrow(e);
}

@SuppressWarnings("unchecked")
public static <T extends Throwable> RuntimeException rethrow(Throwable throwable) throws T {
    throw (T) throwable; // rely on vacuous cast
}

* Больше информацииВот.

звучит так, как будто вам действительно нужно проверить исключения

Если вы рассматриваете использование Unsafe в другом ответе (я рекомендую нет, но в любом случае), другой вариант - использовать дженерики для создания проверенного исключения с помощью этой злой пары методов (изhttp://james-iry.blogspot.co.uk/2010/08/on-removing-java-checked-exceptions-by.html):

   @SuppressWarnings("unchecked")
   private static <T extends Throwable, A> 
     A pervertException(Throwable x) throws T {
      throw (T) x;
   }


   public static <A> A chuck(Throwable t) {
      return Unchecked.
        <RuntimeException, A>pervertException(t);
   }

Вы также можете проверитьcom.google.common.base.Throwables.getRootCause(Throwable) и просто распечатать его (корневую) трассировку стека.

Продолжайте из моего комментария. Вот этостатья это должно пролить свет на проблему. Оно используетsun.misc.Unsafe отбрасывать исключения, не оборачивая их.

class IORuntimeException extends RuntimeException {

    final IOException ioex;

    public IORuntimeException(IOException ioex) {
        this.ioex = ioex;
    }

    @Override
    public String getMessage() {
        return ioex.getMessage();
    }

    @Override
    public StackTraceElement[] getStackTrace() {
        return ioex.getStackTrace();
    }

    //@Override
    // ...
}

(Полный класс доступенВот, произведенный Eclipse «Generate Delegate Methods» макрос.)

Использование:

try {
    ...
} catch (IOException ioex) {
    throw new IORuntimeException(ioex);
}

Проект Ломбок позволяет полностью отключить отмеченные исключения.

Ваш ответ на вопрос