9

鉴于我基本上想消除检查异常的使用并将它们转换为运行时异常,我通常会做这样的事情:

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

这样做有几个缺点,但最让我恼火的是我的运行时异常将包含嵌套的堆栈跟踪。基本上我想用原始消息和堆栈跟踪将“IOException”重新抛出为 RuntimeException(或“IORuntimeException”),这样我就可以避免无用的嵌套堆栈跟踪。我在中间某处重新抛出异常的“事实”对我来说似乎只是无用的噪音。

这可能吗 ?有没有这样做的图书馆?

4

6 回答 6

4

Project Lombok允许您完全禁用已检查的异常。

于 2012-06-08T06:49:12.603 回答
3

从我的评论跟进。这是一篇文章,必须对这个问题有所了解。它用于sun.misc.Unsafe重新抛出异常而不包装它们。

于 2012-06-08T07:17:33.517 回答
2
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“生成委托方法”宏生成。)

用法:

try {
    ...
} catch (IOException ioex) {
    throw new IORuntimeException(ioex);
}
于 2012-06-08T06:52:50.003 回答
2

如果您正在考虑使用其他答案的 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)并打印其(根)堆栈跟踪。

于 2012-06-08T12:22:29.613 回答
0

听起来你实际上需要检查异常

于 2013-02-19T15:38:15.460 回答
0

从 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
}

* 更多信息在这里

于 2016-09-29T08:25:52.943 回答