2

Integerを特定の値 (0 または別のクラスで見つかった属性)に設定したいと考えています。このクラスのインスタンスは of に格納されますMapList、このマップはその時点で null である可能性があるため、これを処理する両方の方法のどちらが優れているか疑問に思います。

Integer value = 0;
if (myMap != null && 
    myMap.get(keyForList) != null && 
    myMap.get(keyForList).get(0) != null) {
    value = myMap.get(keyForList).get(0).getAttribute();
}

または、私がより良く、より効率的であると考える方法:

Integer value = 0;
try {
    value = myMap.get(keyForList).get(0).getAttribute();
} catch (NullPointerException e) {
    // without doing anything value is 0 as expected 
}

助けてくれてありがとう!

4

4 に答える 4

7

標準的なアドバイスは、フロー制御に例外を使用しないことです。それらは比較的重量があり、標準的な制御フローを壊すため、従うのが難しい場合があります。これらは、例外的な状況で使用する必要があります。

それらを使用して状態から回復できないと言っているわけではありませんが、(たとえば)nullまたはゼロをチェックするのが簡単/より明示的である場合は、それを優先して行う必要があります.

(ただし)Javaは冗長であり、次のようなコードでデフォルト/ヌルを処理するための単純な操作がないことに注意してください。

Integer result = a.getB().getC().getD();

そのため、私のアドバイスは次のとおりです。

  1. null オブジェクト パターンを確認してください。これは、上記のシナリオで null チェックを行わなくても済むことを意味します。
  2. 上記のようなコードは、OO 機能が実際に欠如していることを示しています。上記のコードは、 get オブジェクトa自体を取得する必要がbあり、オブジェクトbは getcなどになります。現在の形式では、デメテルの法則をa破り、 、bcなどがどのように構成されているかを明らかにします。OO とは、オブジェクトに何かをしてもらうことであり、オブジェクトが何で構成されているかを教えてもらうのではなく、自分でそれを行わせることであることを忘れないでください。
于 2012-11-15T11:22:36.297 に答える
1

コードに予期しないイベントがない場合は、例外を回避します。次のことをお勧めします。

Integer value = 0;
if (myMap != null)
{ 
    if(myMap.get(keyForList) != null && !myMap.get(keyForList).isEmpty())
          value = myMap.get(keyForList).get(0).getAttribute();
    else
          System.out.println("There is no key " + keyForList + " in my map!");
}
else
    System.out.println("My map is null!");

このようにして、null 値がどこにあるかを確実に知ることができます (デバッグに役立ちます)。

于 2012-11-15T11:28:12.433 に答える
0

例外は、通常の実行フローが失敗し、続行できない場合です。If-elseコードでは壊れません

于 2012-11-15T11:50:10.187 に答える
0

例外は よりもはるかにコストがかかるため、ブロックif内にステートメントが 1 つしかない場合は特に、可能であれば例外を避けることをお勧めします。try{}

ただし、多くのコードを try{} 内にラップできるようになると、例外がより意味を持ち始めます。これは、サンプルコードのケースになり始めていると思います。if ステートメントは 1 つしかありませんが、条件が複雑です。でそれを回避するtry-catch方がおそらく良いでしょう。

入力が通常は有効であると予想される場合、例外は、不正な形式の入力などのエラーをキャッチするのに適しています。

NullPointerException をキャッチして入力 (メソッド引数など) の null ポインターを検出することは、ほとんど良い考えではありません。if呼び出し元の責任である場合は、前に持っているか、介入せずにメソッドから例外をスローさせます(throw NullPointerException他に何も呼び出さずに、ifと自分でnullポインターを検出することも賢明かもしれません)。

于 2012-11-15T11:31:12.890 に答える