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

他の回答の 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 に答える
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 の "Generate Delegate Methods" マクロによって生成されたものとして、ここで入手できます。)

使用法:

try {
    ...
} catch (IOException ioex) {
    throw new IORuntimeException(ioex);
}
于 2012-06-08T06:52:50.003 に答える
0

実際にチェックされた例外が必要なようです

于 2013-02-19T15:38:15.460 に答える