9

私は次のようなコードを持っています:

obj1 = SomeObject.method1();
if (obj1 != null) {
  obj2 = obj1.method2();
  if (obj2 != null) {
     obj3 = obj2.method3();
     if (obj3 != null) {
              ............


     return objN.methodM();

   }
  }
 }
....

10段近くあります。非常に壊れやすく、エラーが発生しやすいようです。null チェーン メソッドをチェックするより良い方法はありますか?

ありがとう。

4

12 に答える 12

5

この質問にうまく答えるには、より多くのコンテキストが必要です。

たとえば、場合によってはif、「各メソッドは 1 つのことを完全かつ正確に実行する必要がある」に従って、内部ステートメントを独自のメソッドに分割することをお勧めします。この場合、メソッドを呼び出して null をチェックするだけです。nullの場合は、返されます (実際のニーズに応じてスローされます)。そうでない場合は、次のメソッドを呼び出します。

最終的には、これは設計上の問題であると思いますが、解決されている問題についての洞察がなければ解決策を知ることはできません.

現状では、コードのこの単一のチャンクには複数の責任 (と思われるもの) に関する深い知識が必要です。つまり、ほとんどすべての場合、これをクリーンにするために、新しいクラス、新しいパターン、新しいインターフェイス、または何らかの組み合わせが必要になります。理解できる。

于 2013-01-21T16:13:30.840 に答える
3

のように書く

obj1 = SomeObject.method1();
if (obj1 == null) 
    return;
 obj2 = obj1.method2();
 if (obj2 == null) 
    return;

C 開発者として、これは非常に一般的なパラダイムであり、非常に一般的です。コードをこのフラット フローに変換できない場合は、コードが存在する言語に関係なく、最初にコードをリファクタリングする必要があります。

、例外などreturn、これらが失敗した場合に実際に行っているものに置き換えます。コードのその部分を省略しましたが、同じロジックである必要があります。return nullthrow

于 2013-01-21T15:57:42.023 に答える
2

この種の質問はすでにここで回答されていると思います。特にNull Object Patternに関する 2 番目の回答を参照してください。

于 2013-01-21T16:13:24.957 に答える
2

nullこれは、Java での参照によくある問題です。

私はチェーンを好む&&

if (obj1 != null && obj1.method1() != null && obj1.method1().method2() != null)
于 2013-01-21T15:56:03.183 に答える
1
obj1 = SomeObject.method1();
if (obj1 == null) throw new IllegalArgumentException("...");

obj2 = obj1.method2();
if (obj2 == null) throw new IllegalArgumentException("...");

obj3 = obj2.method3();
if (obj3 == null) throw new IllegalArgumentException("...");

if (objN != null) {
   return objN.methodM();
}

ここでもう少し議論

于 2013-01-21T16:02:58.363 に答える
1

それらをチェーンして、すべてを try/catch で囲み、NPE をキャッチできます。

このような:

try
{
    Object result = SomeObject.method1().method2().methodN();
    return result;
}
catch(NullPointerException ex)
{
     // Do the errorhandling here.
}

それ以外では、@Neil のコメントを 2 つ目にします。そもそも、そのような連鎖を避けるようにしてください。

編集:

投票は、これが非常に論争であることを示しています. 私は実際にこれをお勧めしないことを理解してもらいたいです!

このように進めることには多くの副作用があり、通常は避けるべきです。目標を達成するための 1 つの方法としてのみ、OP の特別な状況について議論しました。

誰かがこれを行う必要があると感じた場合: 考えられる落とし穴についてコメントを読んでください!

于 2013-01-21T15:53:57.683 に答える
1

このようにフォーマットしてみてください:

obj1 = SomeObject.method1();
if (obj1 != null) {
   obj2 = obj1.method2();
}
if (obj2 != null) {
    obj3 = obj2.method3();
}
if (obj3 != null) {
          ............
}

if (objN != null) {
   return objN.methodM();
}
return null;

objすべてのを に初期化することを忘れないでくださいnull

于 2013-01-21T15:57:53.653 に答える
0

ソース オブジェクトを非常に信頼していて、6 つのオブジェクトを連鎖させようとしている場合は、それらを信頼し続け、スローされたときに例外をキャッチします (できればまれに)。

ただし、ソース オブジェクトを信頼しないことにした場合は、2 つの選択肢があります。強制的な "!= null" チェックをあらゆる場所に追加し、それらのメソッドを連鎖させないことです...

または、元に戻ってソース オブジェクト クラスを変更し、ルートでより適切な null 処理を追加します。手動で行うこともできます (たとえば、セッター内の null チェックを使用)。または、Java 8 のOptionalクラス ( Java 8を使用していない場合は Google の Guavaの Optional クラス) を使用することもできます。設計パターンを処理して、不要な null が導入された瞬間に対応できるようにすることをお勧めします。

于 2015-07-22T20:39:05.723 に答える