2016-04-13 6 views
4

NullPointerExceptionは、常にコードの乱雑さです。すべてのオブジェクトがnullセーフであるかどうかをチェックし、NPEを投げないようにする必要があります。安全なメソッドと式をNullPointerExceptionでコーディングするには?

私は状況に出くわした:

public void aMethod(Employee emp){ 
    String fullEmployeeDetailRow = "Name: "+emp.getName().getFirstName() 
    +"LastName :"+emp.getName().getFirstName() 
    +"Address:" 
    +emp.getAddress().getBillingAddress().getBuildingNumber().getApartmentNumber() 
    +" "  
    +emp.getAddress().getBillingAddress().getStreetName() 
    } 

は、上記の例ではNPEのように多くの可能性があります。

emp.getAddress().getBillingAddress().getBuildingNumber().getApartmentNumber() 

式の例えば、いずれかがNULLと考えられるNPE源とすることができる

getAddress() or getBillingAddress() or getBuildingNumber() 

に呼び出します。だから私は今、それぞれがnullになる可能性があるかどうかを確認するために自分のコードを乱雑にする必要があります。

私の質問/考え方は、式を受け取り、それがNullPointerExceptionをスローするかどうか評価し、デフォルト値を返す場合は空白と言うメソッドを作成する方法ですか?" "

したがって、この場合には、私は方法が必要

expression=emp.getAddress().getBillingAddress().getBuildingNumber().getApartmentNumber()

String checkForNPE(expression){ 
    try{ 
     return expression; 
     }catch(NullPointerException e){ 
     return " " // default Value 
     } 
    } 

問題は、私は、このようなメソッドを作成し、そこに式を渡ししようとすると、Javaは呼び出す前に式を評価していますメソッドとNPEは事前にスローされます!

式にメソッドを渡して、メソッド内で評価するようにJavaに依頼するにはどうすればよいですか?

+0

ここで、式を初期化する場所でtryブロックを作成しないでください。 – Dimi

+0

@Dimiそれは私が避けようとしていることです。 Nullチェック/ NPEコード混乱を避け、try/catchチェックを別のcheckForNPE()メソッドに移動しようとすると、メインコードの式をチェックしないようにしています。同じ場所の周りに多くのそのような式があります(私の例を見てください)。そのコードをcheckForNPE()に委譲して、すべての式を再利用します。 – supernova

答えて

6

この状況では、オプションを使用できます。

Option.ofNullable(emp) 
     .map(e -> e.getAddress()) 
     .map(a -> a.getBillingAddress()) 
     .map(a -> a.getBuildingNumber()) 
     .map(n -> n.getApartmentNumber()) 
     .orElse("not set") 
+0

ありがとうございます。このJava 8の機能を探求します。プリJava 8に似たようなソリューションがありますか? – supernova

+1

あなたの答えに基づいて、この記事は私の質問を正しく提示し、あなたの答えも提示します。 http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html – supernova

+0

@supernovaこれをサポートするライブラリがあるかもしれませんが、ラムダなしではこのコードははるかに冗長です。 –

2

NullPointerExceptionが常にコードcluttrerです。

私は同意しません。

すべてのオブジェクトがnull安全であり、必ずしも真実ではないNPE

を投げていないかどうかを確認する必要があります。あなたのメソッドからNPEをスローすることを許可するのは、使用しようとしている参照の一部が予期せずnullである場合に行うことができる最も合理的なものです。確かに、標準ライブラリは多くの場所でそのアプローチを採用しています。すべての参照が非 - nullであることを検証する必要性が最も高い理由は、外部から課せられた人為的な基準です。

私の質問/思考は、式を取り、NullPointerExceptionをスローするかどうか評価する方法をJavaで作成する方法です。

私はそれは不可能だと言うことを躊躇し、確かにあなたが説明するように、このような汎用的なメソッドを記述するために何簡単方法はありません。 Javaは実行時にJavaソースコードを評価するための準備をしていません。また、何がポイントになるのだろうか?そのようなメソッドを呼び出す代わりに、コードをtryブロック内で実行するだけで済みます。それがNPEを投げて捕まえたら、その状況を処理するのが適切です。式を事前にテストする必要はありません。

どのように式にメソッドを渡し、メソッド内で評価するようJavaに依頼できますか?

できません。それとも、少なくとも、Javaは、私がすでに言ったように、そのための準備をしていません。メソッドの引数として使用する式は、メソッドが呼び出される前に評価され、結果のコピーがメソッドに渡されます。繰り返しますが、try/catchを直接使用してください。これ以外の作業は、はるかに複雑でコストがかかります。

また、@ PeterLawreyのように、すべての単一の参照をテストする方が簡単できれいなアプローチがあります。それはあなたが尋ねたものではありませんが、おそらくそれはあなたに合っています。

関連する問題