19

時々、ここのように、絶対に起こらないことがわかっている例外をキャッチしなければならなくなることがあります

URLDecoder.decode("some string", "UTF-8"); //No unknown encoding possible

またはここ:

public void methodWithURL(URL url){
    URI uri = new URI(url); //No invalud URI syntax possible
}

これをどのように処理しますか?私は通常、宇宙の法則がどのように変化したかに関する面白いエラーをログに記録し、RuntimeException. より良い方法はありますか?

4

5 に答える 5

9

をキャッチしてExceptionでラップしErrorます。のドキュメントからError

Error は、Throwable のサブクラスであり、適切なアプリケーションがキャッチしようとすべきではない重大な問題を示します。

于 2012-07-02T08:39:23.053 に答える
6

面白いメッセージはスキップします。

ところで:コードの一部(小さなライブラリ内)がエンコーディングが利用可能であると仮定した場合がありました。限られたデバイスに展開され、実行時に爆発しただけです。

チェックされた例外は、コード内で一時停止し、パスの移動が少ないと見なすべき場所を示すのに役立ちます (「ネットワークが停止したときにアプリが行うこと」やその他のコーナー ケースなど)。それらを IllegalStateException でラップして再スローすることは、プログラマーが「はい、すべてのリスクを考慮して、ここのスポットに対して全責任を負うことを考慮した」という、署名された契約のようなものです。チェック例外がなければ、単純な思考不足から意識的な決定を知る方法はありません。

于 2012-07-02T08:42:24.193 に答える
3

まあ、私見ですが、「宇宙の法則がどのように変化したかについての面白いエラーをログに記録する」よりも良い方法があります。そうすることで、あなたは「かわいい」ことになります。これは、友人の間では問題ありませんが、普遍的ではありませんの意)承ります。あなたのコードは他の人に読まれる可能性があり、あなたのユーモアがうまくいかない場合は、実際には友達ができていません。

多くのスタイル ガイドは、不可能な例外を提案しています。という名前の例外パラメーターで空の catch ブロックを使用できますwillNeverHappen。空のブロックにコメントを入れることができます。実行時例外をスローできます ( UTF-8 のスペルを間違える可能性があるため、おそらくこれが最適です! )

超野心的になりたい場合は、SneakyThrows in Lombokのような注釈を書くことができます。これを「より良い」と考えるかどうかは、単に好みの問題です。:)

この質問はhttps://softwareengineering.stackexchange.com/questions/122233/how-to-deal-with-checked-exceptions-that-c​​annot-ever-be-thrownで議論されたことに注意してください。

于 2012-07-02T08:31:16.583 に答える
0

これが私の解決策です-Android用に開発されましたが、「通常の」Javaに簡単に適応できます:

public class ImpossibleException extends RuntimeException {
    public ImpossibleException(@NonNull String whyNotPossible) {
        this(whyNotPossible, null);
    }

    public ImpossibleException(@NonNull String whyNotPossible, Throwable throwable) {
        super("Impossible exception: " + whyNotPossible, throwable);
        Log.e("Impossible", whyNotPossible, throwable);
    }
}

使用法:

try {
    byte[] data = "Hello".getBytes("utf-8");
    Log.i("Test", "data.length=" + data.length);
} catch (UnsupportedEncodingException e) {
    throw new ImpossibleException("Android always supports utf-8", e);
}

コンストラクターは、whyNotPossible発生したエラーをログに記録する必要がないことを意味し、コメントも必要ありません。

ImpossibleException extends RuntimeExceptionこれが かかは好みの問題だと思いImpossibleError extends Errorます。

于 2016-04-20T07:10:04.637 に答える