2013-06-22 108 views
2

我不斷收到此錯誤信息時發生的類型「System.NullReferenceException」未處理的異常:每當樹節點上點擊一下樹節點

型「System.NullReferenceException」 的未處理的異常出現在圖片-Resize.exe附加信息:對象 引用未設置爲對象的實例。

我的代碼如下:

public Form1() 
{ 
    InitializeComponent(); 
    this.treeView1.NodeMouseClick += new TreeNodeMouseClickEventHandler (this.treeView1_NodeMouseClick); 
    PopulateTreeView(); 
} 

private void PopulateTreeView() 
{ 
    TreeNode rootNode; 

    DirectoryInfo info = new DirectoryInfo(@"c:\\"); 
    if (info.Exists) 
    { 
     rootNode = new TreeNode(info.Name); 
     rootNode.Tag = info; 
     GetDirectories(info.GetDirectories(), rootNode); 
     treeView1.Nodes.Add(rootNode); 
    } 
} 

private void GetDirectories(DirectoryInfo[] subDirs, TreeNode nodeToAddTo) 
{ 
    TreeNode aNode; 
    DirectoryInfo[] subSubDirs; 
    foreach (DirectoryInfo subDir in subDirs) 
    { 
     aNode = new TreeNode(subDir.Name, 0, 0); 
     aNode.Tag = subDir; 
     aNode.ImageKey = "folder"; 
     try 
     { 
      /* subSubDirs = subDir.GetDirectories(); 
      if (subSubDirs.Length != 0) 
      { 
       GetDirectories2(subSubDirs, aNode); 
      }*/ 
     } 
     catch (System.UnauthorizedAccessException) 
     { 
      subSubDirs = new DirectoryInfo[0]; 
     } 
     nodeToAddTo.Nodes.Add(aNode); 
    } 
} 


void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
{    
    //if (treeView1.SelectedNode.Nodes.Count > 0) { MessageBox.Show("Child node exists"); } else { MessageBox.Show("Child Node does not exist"); } 

    try 
    { 
     TreeNode newSelected = e.Node; 
    // treeView1.SelectedNode.Nodes.Add("test"); 

     listView1.Items.Clear(); 
     DirectoryInfo nodeDirInfo = (DirectoryInfo)newSelected.Tag; 
     ListViewItem.ListViewSubItem[] subItems; 

     ListViewItem item = null; 

     foreach (DirectoryInfo dir in nodeDirInfo.GetDirectories()) 
     { 
      item = new ListViewItem(dir.Name, 0); 
      subItems = new ListViewItem.ListViewSubItem[] 
      {new ListViewItem.ListViewSubItem(item, "Directory"), 
      new ListViewItem.ListViewSubItem(item, 
       dir.LastAccessTime.ToShortDateString())}; 
      item.SubItems.AddRange(subItems); 
      listView1.Items.Add(item); 
     } 
     foreach (FileInfo file in nodeDirInfo.GetFiles()) 
     { 
      item = new ListViewItem(file.Name, 1); 
      subItems = new ListViewItem.ListViewSubItem[] 
      { new ListViewItem.ListViewSubItem(item, "File"), 
      new ListViewItem.ListViewSubItem(item, 
       file.LastAccessTime.ToShortDateString())}; 

      item.SubItems.AddRange(subItems); 
      listView1.Items.Add(item); 
     } 

     listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); 
    } 
    catch (Exception ex) 
    { 
     if (ex is System.NullReferenceException || ex is System.UnauthorizedAccessException) 
     { 
     } 
    } 
} 

什麼情況是異常處理程序捕獲它,而是因爲一個異常被拋出它要求用戶的點擊處理程序點擊兩次才能生效。

爲什麼我得到這個錯誤,以及如何避免它?

+0

在哪一行代碼被拋出異常 –

+0

這種異常非常容易調試和修復,您應該指出(突出顯示)引發異常的代碼行。在不瞭解代碼行的情況下,我不認爲任何人都可以(隨時)從NodeMouseClick事件處理程序的開頭到結尾追蹤所有內容以幫助您。 –

+0

我複製了你的代碼,它的工作原理沒有任何異常! – Masoud

回答

2
//if (treeView1.SelectedNode.Nodes.Count > 0) 

這確實是錯誤的。在觸發NodeMouseClick事件後,纔會選擇節點,直到。所以如果沒有選擇,這個代碼很可能會用NRE炸彈。並且需要點擊兩次,因爲第一次點擊會提供先前選擇的節點。

您應改爲使用e.Node屬性,它會爲您提供被單擊的節點。代碼的意圖有點不清楚,很可能你應該使用AfterSelect事件。所以當用戶使用鍵盤選擇節點時它仍然有效。

+0

你釘了它!謝謝! – TK421

6

您需要調試您的代碼。

我假設你正在使用Visual Studio,如果是的話那麼這樣做:

  1. 進入調試菜單。
  2. 單擊例外...選項。
  3. 以下對話框會出現: enter image description here

注意公共語言運行庫異常複選框被選中。

單擊確定後,現在當您隨時調試代碼時,代碼或.NET Framework引發異常時,調試器將在引發異常的行上停止。這使得發現某些東西「打破」更容易。