2017-07-01 6 views
0

キーを取得しようとしたときに問題はありませんが、辞書から値を取得しようとしたときに問題がありました。値は2つのフィールドを含むクラスで、2つのパラメーターを持つコンストラクターがあります。ここ はコードです:LINQを使用して辞書の値を取得しようとしたときにNullReferenceExceptionが発生しました

public class SetupWeapon { 

     public int poolSize; 
     public GameObject prefab; 

     public SetupWeapon(int size, GameObject goPrefab) { 
      this.poolSize = size; 
      this.prefab = goPrefab; 
     } 
    } 
    private SetupWeapon[] _setupWeapon = new SetupWeapon[1]; 
    private Dictionary<int, SetupWeapon> _weaponData = new Dictionary<int, SetupWeapon>(); 
    public int[] AttackIDs { 
     get { 
      var toArray = _weaponData.Select(a => a.Key).ToArray(); 
      return toArray; 
     } 
    } 
    private int[] PoolSize { 
     get { 
      var toArray = _weaponData.Select(a => a.Value.poolSize).ToArray(); 
      return toArray; 
     } 
    } 
    private GameObject[] Prefab { 
     get { 
      var toArray = _weaponData.Select(a => a.Value.prefab).ToArray(); 
      return toArray; 
     } 
    } 

    void Start() { 
     CollectData(setPhysical); // collecting data 
     CollectData(setLeftEye); 
     CollectData(setRightEye); 
     CollectData(setForehead); 
     CollectData(setMouth); 
     for (int i = 0; i < AttackIDs.Length; i++){ 
      Debug.Log(AttackIDs[i]); // works just fine 
      Debug.Log(_weaponData[0].poolSize); // works just fine 
      Debug.Log(_weaponData[0].prefab.name); // works just fine 
      Debug.Log(PoolSize[0]); // NullReferenceException 
      Debug.Log(Prefab[0].name); // NullReferenceException 
     } 
    } 

私はこのエラーの原因となる重要な何かを見逃していましたか?

+0

[NullReferenceExceptionとは何か、それを修正するにはどうすればいいですか?](https://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix -it) – rene

+0

スレッドが私の問題を解決したとは思わない。私の場合、それはちょうど私にNullReferenceExceptionを与える値の部分です。そして、このコード行は奇妙だと思いませんか? 'Debug.Log(_weaponData [0] .poolSize); //うまく動作します Debug.Log(_weaponData [0] .prefab.name); //うまく動作します Debug.Log(PoolSize [0]); // NullReferenceException Debug.Log(Prefab [0] .name); // NullReferenceException' –

+1

あなたは_weaponData辞書を初期化していないようです。作成されましたが、要素は追加されていません –

答えて

0

あなたのクラスをコピーし、テストコードをdotnetfiddleで作成しました。

https://dotnetfiddle.net/Widget/Ohctbm

あなたが_weaponDataにアクセスするとき、私はときに[0]、あなたは、キーとして0を使用し、ヌルSetupWeaponはところであなた_weaponData

に追加されている場合はnull例外を取得することができますよアクセスPoolSize [0]、0はインデックスでなければなりません。あなたがこれを行うつもりかどうかはわかりません。

public class Program 
{ 
    public class GameObject{ 
     public string name; 
    } 

    public class SetupWeapon { 

     public int poolSize; 
     public GameObject prefab; 

     public SetupWeapon(int size, GameObject goPrefab) { 
      this.poolSize = size; 
      this.prefab = goPrefab; 
     } 
    } 


     public int[] AttackIDs { 
     get { 
      var toArray = _weaponData.Select(a => a.Key).ToArray(); 
      return toArray; 
     } 
    } 
    private int[] PoolSize { 
     get { 
      var toArray = _weaponData.Select(a => a.Value.poolSize).ToArray(); 
      return toArray; 
     } 
    } 
    private GameObject[] Prefab { 
     get { 
      var toArray = _weaponData.Select(a => a.Value.prefab).ToArray(); 
      return toArray; 
     } 
    } 

    public Dictionary<int, SetupWeapon> _weaponData = new Dictionary<int, SetupWeapon>(); 
    public void Start() { 

     for (int i = 0; i < AttackIDs.Length; i++){ 
      Console.WriteLine(AttackIDs[i]); // works just fine 
      Console.WriteLine(_weaponData[0].poolSize); // works just fine 
      Console.WriteLine(_weaponData[0].prefab.name); // works just fine 
      Console.WriteLine(PoolSize[0]); // NullReferenceException 
      Console.WriteLine(Prefab[0].name); // NullReferenceException 
     } 
    } 

    public static void Main() 
    { 
     var p = new Program(); 
     p._weaponData.Add(0, new SetupWeapon(0, new GameObject(){ name = "0"})); 
     p._weaponData.Add(1, null); // this will cause null exception 
     p._weaponData.Add(2, new SetupWeapon(2, null)); // this will not cause null exception 

     p.Start(); 

    } 
} 
+0

私は多目的な方法を持っています。辞書の値がnullの場合もあり、混乱しているようです。だから、読みやすくするためにメソッドを書き直さなければならないかもしれません。助けてくれてありがとう。 –

0

GameObject []ではなくSetupWeapon []のみを取得できます。

関連する問題