2016-10-11 4 views
-3

私は完全にこの1つに困惑しています。 Object reference not set to an instance of an object.というエラーが表示されていますが、その理由はわかりません。c# - 実行していないコードが例外を引き起こしていますか?これはどのように可能ですか?

私は次のように私は、インスタンスを作成していFILE

public class FILE 
    { 
     private string _fileName; 
     public string fileName 
     { 

      get 
      { 
       if (!Settings.Values.CaseSensitive) 
        return this._fileName.ToUpper(); 
       else 
        return this._fileName; 
      } 
      set 
      { 
       if (!Settings.Values.CaseSensitive) 
        this._fileName = value.ToUpper(); 
       else 
        this._fileName = value; 
      } 
     } 
     public string folderName { get; set; } 
     public byte[] fileHashDigest { get; set; } 
    } 

クラスを持っている:

FILE test1233;  
test1233 = new FILE(); // <---- Ex thrown here!? Why???  
test1233.fileName = ""; 
folderName = ""; 
fileHashDigest = new byte[1]; 

とすぐに、変数がスタックに置かれるように、それは例外をスローします。しかし、もし私がこの変数のすべてのrefrencesをコードからさらに削除すると(これはまだデバッグモードでは実行されていません!!!)、例外はスローされません。今ここで何が起こっているのですか?

private bool IsFolderOverride(FileCollection zipFILEList, DataTable exceptionTableFileList, DataRow currentRow, ref DataTable detectedFolderRenames) 
    { 
     bool foundInExceptionTable = false; 
     foreach (DataRow exRow in exceptionTableFileList.Rows) 
     { 
      if (exRow["FILE_NAME"].ToString().ToUpper() == currentRow["FILE_NAME"].ToString().ToUpper() && 
       (decimal)exRow["WINDOW_GROUP_ID"] == (decimal)currentRow["WINDOW_GROUP_ID"]) 
      { 
       string name = exRow["FILE_NAME"].ToString().ToUpper(); 
       string folder = exRow["FOLDER_NAME"].ToString().ToUpper(); 
       byte[] digest = (byte[])exRow["FILE_HASH_DIGEST"]; 
       CopyCat exCopyCat = new CopyCat(); 
       exCopyCat.fileName = name; 
       exCopyCat.folderName = folder; 
       exCopyCat.fileHashDigest = digest; 

       //HAS AN EXCEPTION! 
       FILE test1233 = new FILE(); 
       test1233.fileName = ""; 
       test1233.folderName = ""; 
       test1233.fileHashDigest = new byte[1]; 

       //NO EXCEPTION THROWN 
       FILE test = new FILE(); 
       bool test9 = zipFileList.Contains(test1233); 


       test.fileName = name; 
       test.folderName = folder; 
       test.fileHashDigest = digest; 

       FILE test123 = new FILE(); 

       if (zipFileList.Contains(test1233)) // Exact match found in zip in old folder from exception table. 
       { 
        FILE exists = zipFileList.Where(f => f.fileName == test1233.fileName && 
              f.fileHashDigest.SequenceEqual(test1233.fileHashDigest)).First(); 
        object[] items = exRow.ItemArray; 
        Array.Resize(ref items, items.Length + 4); 
        items[items.Length - 1] = "Y"; 
        items[items.Length - 2] = exists.folderName; 
        items[items.Length - 3] = test1233.folderName; 
        items[items.Length - 4] = "Folder Override"; 
        if (detectedFolderRenames.Rows.Count == 0 || !detectedFolderRenames.Rows.Contains(items[0])) 
         detectedFolderRenames.Rows.Add(items); 

        foundInExceptionTable = true; 
        break; 
       } 
       else if (zipFileList.ContainsPartially(test1233)) // Match in zip with Different Hash found from ex table. 
       { 
        FILE exists = zipFileList.Where(f => f.fileName == test1233.fileName).First(); 
        object[] items = exRow.ItemArray; 
        Array.Resize(ref items, items.Length + 4); 
        items[items.Length - 1] = "N"; 
        items[items.Length - 2] = exists.folderName; 
        items[items.Length - 3] = test1233.folderName; 
        items[items.Length - 4] = "Folder Override"; 
        if (detectedFolderRenames.Rows.Count == 0 || !detectedFolderRenames.Rows.Contains(items[0])) 
         detectedFolderRenames.Rows.Add(items); 

        foundInExceptionTable = true; 
        break; 
       } 
      } 
      else 
       continue; 
     } 
     return foundInExceptionTable; 
    } 

UPDATE:私はまだあなたのための例に取り組んでいますが、ここでは平均時間に潜在的に有用な情報である:refrenceについては

は、ここでそれは全体だ方法である

test1233' threw an exception of type 'System.NullReferenceException' 
Data: {System.Collections.ListDictionaryInternal} 
HResult: -2147467261 
HelpLink: null 
InnerException: null 
Message: "Object reference not set to an instance of an object." 
Source: null 
StackTrace: null 
TargetSite: null 

Data: {System.Collections.ListDictionaryInternal}の部分は少し面白いですが、私のクラスでは辞書リストを使用していません。

更新#2:OK、私は他人が試してみるための再現可能な一連のステップを作りました。あなたのマシンでは、Jon Skeet氏のように、デバッグ環境の設定かもしれませんが、私に知らせてください。再現する手順は次のとおりです。

  1. コンソールアプリケーションプロジェクトを開き、以下のペーストコードをコピーします。
  2. ここにブレークポイントを設定してください:enter image description here
  3. 最初の実行コードの前のブレークポイントは、動作します! :D
  4. は、再度コードを実行するが、この時STOPがブレークポイントで、ここからのif文INTO実行文でカーソルをドラッグします。ここに enter image description here :あり enter image description here

それはです!だからエラーは私のテスト方法に起因していますが、これは意味がありますか、これは私のマシン上の私ですか?

CODE:

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace testapp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      FILECollection randomCollection = new FILECollection(); 
      // Fill with junk test data: 
      for(int i = 0; i<10; i++) 
      { 
       FILE junkfile = new FILE() { fileName = i.ToString(), folderName = i.ToString(), fileHashDigest = new byte[1] }; 
       randomCollection.Add(junkfile); 
      } 

      if (true) 
      { 
       Console.WriteLine("testing this weird exception issue..."); 
       FILE test; 
       test = new FILE(); 
       test.fileName = "3"; 
       test.folderName = "3"; 
       test.fileHashDigest = new byte[1]; 

       FILE exists = randomCollection.Where(f => f.fileName == test.fileName && 
               f.fileHashDigest.SequenceEqual(test.fileHashDigest)).First(); 
      } 
     } 
    } 


    public class FILE 
    { 
     public FILE() { _fileName = "";} 
     private string _fileName; 
     public string fileName 
     { 

      get 
      { 
        if (false) 
         return this._fileName.ToUpper(); 
        else 
         return this._fileName; 
      } 
      set 
      { 

        if (false) 
         this._fileName = value.ToUpper(); 
        else 
         this._fileName = value; 
      } 
     } 
     public string folderName { get; set; } 
     public byte[] fileHashDigest { get; set; } 
    } 

    public class FILECollection : IEnumerable<FILE>, ICollection<FILE> 
    { 
     private HashSet<FILE> svgHash; 
     private static List<FILE> PreallocationList; 
     public string FileName = "N/A"; 

     /// <summary> 
     /// Default Constructor, will not 
     /// preallocate memory. 
     /// </summary> 
     /// <param name="PreallocationSize"></param> 
     public FILECollection() 
     { 
      this.svgHash = new HashSet<FILE>(); 
      this.svgHash.Clear(); 
     } 

     /// <summary> 
     /// Overload Constructor Preallocates 
     /// memory to be used for the new 
     /// FILE Collection. 
     /// </summary> 
     public FILECollection(int PreallocationSize, string fileName = "N/A", int fileHashDigestSize = 32) 
     { 
      FileName = fileName; 
      PreallocationList = new List<FILE>(PreallocationSize); 
      for (int i = 0; i <= PreallocationSize; i++) 
      { 
       byte[] buffer = new byte[fileHashDigestSize]; 
       FILE preallocationSVG = new FILE() 
       { 
        fileName = "", 
        folderName = "", 
        fileHashDigest = buffer 
       }; 
       PreallocationList.Add(preallocationSVG); 
      } 
      this.svgHash = new HashSet<FILE>(PreallocationList); 
      this.svgHash.Clear(); // Capacity remains unchanged until a call to TrimExcess is made. 
     } 

     /// <summary> 
     /// Add an FILE file to 
     /// the FILE Collection. 
     /// </summary> 
     /// <param name="svg"></param> 
     public void Add(FILE svg) 
     { 
      this.svgHash.Add(svg); 
     } 

     /// <summary> 
     /// Removes all elements 
     /// from the FILE Collection 
     /// </summary> 
     public void Clear() 
     { 
      svgHash.Clear(); 
     } 


     /// <summary> 
     /// Determine if the FILE collection 
     /// contains the EXACT FILE file, folder, 
     /// and byte[] sequence. This guarantees 
     /// that the collection contains the EXACT 
     /// file you are looking for. 
     /// </summary> 
     /// <param name="item"></param> 
     /// <returns></returns> 
     public bool Contains(FILE item) 
     { 
      return svgHash.Any(f => f.fileHashDigest.SequenceEqual(item.fileHashDigest) && 
            f.fileName == item.fileName && 
            f.folderName == item.folderName); 
     } 

     /// <summary> 
     /// Determine if the FILE collection 
     /// contains the same file and folder name, 
     /// byte[] sequence is not compared. The file and folder 
     /// name may be the same but this does not guarantee the 
     /// file contents are exactly the same. Use Contains() instead. 
     /// </summary> 
     /// <param name="item"></param> 
     /// <returns></returns> 
     public bool ContainsPartially(FILE item) 
     { 
      return svgHash.Any(f => f.fileName == item.fileName && 
            f.folderName == item.folderName); 
     } 

     /// <summary> 
     /// Returns the total number 
     /// of FILE files in the Collection. 
     /// </summary> 
     public int Count 
     { get { return svgHash.Count(); } } 

     public bool IsReadOnly 
     { get { return true; } } 

     public void CopyTo(FILE[] array, int arrayIndex) 
     { 
      svgHash.CopyTo(array, arrayIndex); 
     } 

     public bool Remove(FILE item) 
     { 
      return svgHash.Remove(item); 
     } 

     public IEnumerator<FILE> GetEnumerator() 
     { 
      return svgHash.GetEnumerator(); 
     } 

     IEnumerator IEnumerable.GetEnumerator() 
     { 
      return svgHash.GetEnumerator(); 
     } 
    } 
} 

私はひどく間違った方法でデバッグしています、またはマイクロソフトでは、このを見てみる必要がありますどちらかだと思います。それは、将来のコードが現在のコードを破るようなものです...不可能です!

+0

だけのカップルです: 'ファイルのようなクラスのものを(名前はありません')がフレームワークにすでに存在しています。また、すべての参照をさらに削除すると、コンパイラは変数の作成をスキップすると思います。 – DrewJordan

+8

私はあなたの診断の面で、おそらく環境に何か不安を感じています。あなたが[mcve]でこれを再現できれば、私たちはもっと助けることができるでしょう。 –

+0

パラメータが少ないコンストラクタが必要なのでしょうか? – Hackerman

答えて

0

私はコンソールアプリケーションでコードを実行しようとしています、あなたは詳細を与えることができますか?ここでは、FILEのインスタンスを作成できる必要があるため、ここでは設定の初期化に関する回答は意味を持ちません。一度あなたが割り当て(設定)または要求(取得)しようとすると、あなたはfileNameプロパティを扱っています。インスタンスを作成するときになぜ例外が発生するのか分かりません。

static void Main(string[] args) 
     { 
      FILE test1233; 
      test1233 = new FILE(); // <---- Ex is not thrown here!?       test1233.fileName = ""; 
      test1233.folderName = ""; 
      test1233.fileHashDigest = new byte[1]; 
     } 

public class FILE 
    { 
     private string _fileName; 
     public string fileName 
     { 

      get 
      { 
       if (YOUR SETTING CONDITION HERE) 
        return this._fileName.ToUpper(); 
       else 
        return this._fileName; 
      } 
      set 
      { 
       if (YOUR SETTING CONDITION HERE) 
        this._fileName = value.ToUpper(); 
       else 
        this._fileName = value; 
      } 
     } 
     public string folderName { get; set; } 
     public byte[] fileHashDigest { get; set; } 
    } 

は、印刷画面ここで enter image description here

にカーソルを参照することは、私のデバッグコンフィギュレーションノートの

enter image description here

+0

FYI、再現可能なステップとコードを追加しました。今のところ、コードを実行しても邪魔にならないように見えるので、これを無視するつもりですが、上記のデバッグステップに続いて例外がスローされます。奇妙な –

+0

これは例外をスローしません。おそらくデバッグの設定が違うので、私はこの回答に私を添付します。別のものかどうかを確認してください。 – Zinov

+0

それは変です。後で私がセパレートマシンに家に帰るとき、それは非常によくデバッグ設定することができます。 –

関連する問題