2017-09-07 6 views
0

は、あなたがこのようなコードがあるとしましょう:デバッギングモードでチェーンメソッドを実行すると、NullReferenceExceptionの原因がわかりますか?

Human mario = HumanFactory.CreateRandomHuman(); 

Console.WriteLine(mario.GetFamily().GetFather().GetEyeColor()); 

そして、あなたがデバッグモードでこれを実行し、それはエラーメッセージ'Object reference not set to an instance of an object.'で、System.NullReferenceExceptionを得るように、その行を示しています。しかし、あなたが実際にどの知らないとしましょうオブジェクトはnullです。

Visual Studioでどのオブジェクトが実際に参照例外を引き起こしたのかを知る方法はありますか?デバッガは、単に例外を発生させたとして、全体のラインを示しているが、marioがnullの場合、あなたは知らない、またはGetFamily()がnullを返した、またはGetFather()は過去になど、

をnullを返した場合、私はちょうどそれが壊れてしまった場合個々の行に移動し、nullの例外が出るまでそれらのステップを進めますが、チェーンを分割することを伴わない簡単な方法が必要です。

+1

実際には、VS 2017では、未処理の例外ポップアップが、どの呼び出しがnullを返したかを教えてくれます。それは便利です!私は2012年をチェックさせてください...いいえ、2012年はそれをしません。 –

+0

「Mario」を選択し、右クリックして、クイックウォッチを選択します。クイックウォッチウィンドウで、 '.GetFamily()'を追加して再評価します。 nullが見つかるまで続けます。または、バグが見つかるまで一時的に書き換えます。 – Will

答えて

1

おそらくなど

を表現Mario.GetFamily()の一部を選択した後、Shiftキーを押しながらF9キーを押す、またはMario.GetFamily().GetFather()でそれを行うことができますしかし、あなたはあなたのコードにバグがあり、第1、物事がはるかに容易になることを修正します。

  • あなたのgetXXX()メソッドは、それらの少なくとも1つは、この制約を尊重されていない場合は、nullを返すことを想定されることはありませんどちらか。各メソッドにブレークポイントを追加して、どのメソッドが問題なのかを調べ、修正します。

  • このような保証はありません。この場合、上記のコードは各メソッドから返されたnullをテストする必要があります。例外がIDEにスローされ

    mario.GetFamily()?.GetFather()?.GetEyeColor() 
    
1

は、使用「クイック・ウォッチ」マリオに(Shiftキーを押しながらF9):あなたがC#6を使用している場合は、このための便利なショートカットがあります。 クイックウォッチウィンドウでは、チェーンを繰り返し構築し、追加するたびに再評価して、nullが返される時期を確認できます。

関連する問題