2016-05-10 10 views
1

if条件に応じていくつかのアクションを実行する必要があります。イベントのタイプである場合、「GIVE_AWAY_MONEY_ON_SIGNUP」)はNullPointerExceptionが発生した場合の回避方法

private boolean verifyGiveAwayAccounting(GiveAwayMoneyVerificationEvent event) { 

    if(event.getVoucherType().equals(VoucherType.GIVE_AWAY_MONEY_ON_SIGNUP)){ 
     someAction(); 
    } 
    return verifySystemAccountTransaction(event); 
} 

IはsomeActionを(実行する必要があり - :今私はそれを条件に応じて実行され、コードを持っている

「VoucherType」私は列挙型を持っていると言います。しかし、イベントタイプは "GIVE_AWAY_MONEY_ON_SIGNUP"以外の何かを追加する必要はありません。だから私はこのコードを呼び出すときにvoucherTypeを "GIVE_AWAY_MONEY_ON_SIGNUP"に設定し、someAction()を実行します。

他のイベントタイプでは、何も特別な操作をしたくないので、バウチャータイプを決して設定しないので、if条件にnullポインタ例外が発生します。ですから、nullPointerExceptionを回避するために、私は何もダミー(他のvoucherType値)にバウチャーコードを設定しました。イベントでVoucherTypeを初期化せずにnullPointerExceptionを排除できる洗練された方法はありますか?

+1

if(enum && enum.Football)? –

+0

これは動作しません。条件の最初の部分はnullに評価されるため、nullPointerExceptionをスローします。 – pune06

+0

なぜ非常に多くのダウン投票。私はコミュニティに新しい人です。私のコメント、downvotesの理由を助けてください。 – pune06

答えて

1

ウィキブックスによって定義されるようにアプリケーションがNULL値を有する、オブジェクト参照を使用しようとしたとき

A NullPointerExceptionがスローされます。 null参照によって参照されるオブジェクトに対してインスタンスメソッドを呼び出します。

enum値をインスタンス化しないと、値はnullになります。したがって、プログラムはnullを含むオブジェクトを参照しようとしています。このオブジェクトにはNullPointerExceptionがスローされます。

したがって、いいえ、あなたのNullPointerExceptionを避ける方法はありません。変数を参照する前に変数をインスタンス化する必要があります。

6

このオブジェクトの属性に関するテストを行う前に、オブジェクトがnullでないかどうかを常にテストする必要があります。

+0

ありがとう@Asma - はい、ポイントは非常によく取られています。しかし、私は別の答えを探しています。別の方法がありますか?しかし、それを持っている可能性は酷いです:) – pune06

+2

@ pune06あなたはなぜこのソリューションを使いたくないのか説明できますか?また、あなたが質問したあなたの理由を説明することができます、他の人は同様のソリューションを投稿する前にそれらについて読む機会がありますか? – Pshemo

+0

enumがあなたのオブジェクトである場合(あなたの変数名にキーワードが与えられないようにしなければならない)、NPEをテストする以外の方法はありません。あなたのコードとあなたの問題についての詳細はあなたを助けるのに役立ちます。 – Asma

1

enum.Footballの値をチェックしようとする前にenumがnullでないかどうかを確認します。

void method(){ 
     if(enum!=null && enum.Football){ 
      SomeAction(); 
     } 
    } 
3

eventは、おそらくあなたは、あなたのテストを反転させることができ、この場合には、nullことはありません場合:

別に
private boolean verifyGiveAwayAccounting(GiveAwayMoneyVerificationEvent event) { 
    if(event != null && VoucherType.GIVE_AWAY_MONEY_ON_SIGNUP.equals(event.getVoucherType())){ 
      someAction(); 
    } 
    return verifySystemAccountTransaction(event); 
} 
+1

実際にenumを比較しているので、参照を==と比較し、equalsをまったく使用しないことができます。それはNPEのさらなる可能性を排除するだろう。 –

+0

@ 911DidBushもちろん、これは可能ですが、いくつかの人々はさまざまな理由からequalsメソッドを好んでいます。元のコードはequalsメソッドを使用していました。 – dams

1

private boolean verifyGiveAwayAccounting(GiveAwayMoneyVerificationEvent event) { 
    if(VoucherType.GIVE_AWAY_MONEY_ON_SIGNUP.equals(event.getVoucherType())){ 
      someAction(); 
    } 
    return verifySystemAccountTransaction(event); 
} 

eventは前nullない場合はそうでなければ、テストする必要がありますすでに述べたnullのチェックの答え、別の可能性は、実際には追加のenum値を作成することです

public enum VoucherType { 
    UNDEFINED, 
    GIVE_AWAY_MONEY_ON_SIGNUP, 
    //.... 
    ; 
} 

デフォルト値として「UNDEFINED」を定義します:

方法イベントはvoucherTypeとしてnullを持つことはありません
public class Event { 
    private VoucherType voucherType = VoucherType.UNDEFINED; 

    public Event() { 
    } 

    public VoucherType getVoucherType() { 
     return this.voucherType; 
    } 

    public void setVoucherType(VoucherType voucherType) { 
     if(voucherType==null) { 
      throw new IllegalArgumentException(); // make sure that voucher type cannot be set to null 
     } 
     this.voucherType=voucherType; 
    } 
} 

をデフォルト値としてという帰(「ダミーの値」)を表し、Eおよび使用代わりにenum値UNDEFINEDを使用します。

警告: 多くの人々は、彼らがvoucherTypeを設定するのを忘れたときにフィードバックを得るすぐにする代わりに、上記の溶液にNullPointerExceptionが供給好むだろう。上記の解決方法では、voucherTypeを設定することを忘れて、それを実現しないというエラーが発生します(コードがエラーをスローしないため)。

また、voucherTypeが意味のある値に設定されている必要がある操作ではまだ未定義であるかどうかを確認する必要があります。

私は実際にはnullを自分でチェックしますが、他の解決策が必要だと言って以来、私はこれをとにかく投稿したと思います。

+1

デフォルト値は興味深い提案ですが、私の意見では、 'throw new new IllegalArgumentException();'はセッターでより適切です – dams

+0

あなたの努力のために@ 911DidBushをお世話になりました - はい、現在私は列挙体にDummyValueを使用しています。私のような:) – pune06

関連する問題