例:
foobar = new InputStreamReader(p.getInputStream(), "ISO-8859-1");
エンコーディングはハードコーディングされており、正しいため、仕様で宣言されたUnsupportedEncodingExceptionがコンストラクターによってスローされることはありません(Java実装が壊れている場合を除いて、いずれにしても失われます)。とにかく、Javaはとにかくその例外に対処することを強制します。
現在、そのように見えます
try {
foobar = new InputStreamReader(p.getInputStream(), "ISO-8859-1");
}
catch(UnsupportedEncodingException e) { /* won't ever happen */ }
それをより良くするためのアイデアはありますか?
安全のために、assert
をcatchブロックに入れるのが私の習慣です。誰かがtry
ブロックの内容を後で変更する可能性があり、コードが失敗したかどうかを知りたいですか?
ログ/エラーを見るたびに1セントが与えられた場合、「これは決して起こらないはずです」とすると、2セントになります。それでも...
空のcatchブロックは、スパイダーをチクチクさせ、最も優れたコードアナライザーツールが不満を言うようにします。私はそれらを空のままにしておくことは絶対に避けます。確かに、これでエラーが発生することはないことがわかりましたが、1年後、誰かが「ISO-8859-1」のグローバル検索置換を行うと、突然、バグを見つけるのが非常に困難になる可能性があります。
assert false
提案は適切ですが、アサーション 無効にできる の実行時であるため、保証はありません。代わりにRuntimeException
を使用します。これらは、クラスを呼び出すことで捕捉する必要はありません。それらが発生した場合は、完全な情報を提供するスタックトレースがあります。
私はいつもこのようにしてきました:
try {
foobar = new InputStreamReader(p.getInputStream(), "ISO-8859-1");
} catch(UnsupportedEncodingException e) {
throw new AssertionError(e);
}
少し冗長かもしれませんが(Javaは...)、少なくとも不可能が発生するとアサーションエラーが発生します。
Javaの実装が壊れている場合は、不可能を無視するのではなく、できるだけ早く、できるだけ迅速にエラーメッセージを取得する必要があります。Java実装は壊れていません。誰かがyourコードを"UTF8"
に変更した可能性があります(おっと-"UTF-8"
であったはずですか?)。
このすべきは、そもそもランタイム例外でした。 JDKはこの種の間違った選択でいっぱいです。
これらの例外の中で私をいらいらさせるのは、コードのカバレッジが損なわれることです。
カバレッジについて強引になっているときは、「決して起こり得ない」(または、何らかの形で「US-ASCII」を含めるのを忘れたミュータントJVMを使用している場合のみ)トライ/キャッチをロールアップします。このtry/catchをカプセル化し、チェックされた例外をここで説明されている方法のいずれかで置き換えるクラスとメソッド(通常、チェックされていない例外をsnideメッセージでスローします)。
次に、私のコードカバレッジはユーティリティクラスでヒットしますが、コードに散在するその操作へのすべての参照ではヒットしません。
時々、実際には一貫したセマンティクスを持つクラスの操作のように、時間をかけてロールアップします。しかし、何が起こっているかは私のチームメイトにはかなり明白なので、私は通常、可能な限りシンプルにして、可能な限り最高のデザインについてそれほど心配しません。
ただし、コメントで述べたように、Guavaや他のライブラリにはこの痛みを軽減する方法がありますが、それは基本的に同じ戦略です。煩わしさをオフステージに移動して、メインコードがカバレッジでヒットしないようにします。
あなたがこのコードを見ることができる唯一の開発者であれば、私はそれを大丈夫と言いますが、そうでなければ、私はそれを本当の可能性として扱うか、少なくとも「決して起こらない」というコメントを変更しますもっと便利なもの。