2010-10-11 59 views
1

我在處理按鈕單擊事件的一些簡單代碼上收到NullReferenceException錯誤。我仍然只需要添加一些代碼即可在消息框中實際顯示來自「TcpAddr」的值。這將允許您運行該程序,但單擊該按鈕會導致該錯誤。讀取註冊表項時出現C#NullReferenceException

另外:是否更好的做法是將實際查詢移出click事件,並讓click事件處理MessageBox.Show()?

using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using Microsoft.Win32; 

namespace LiteSwitch 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      RegistryKey RegKey = Registry.LocalMachine; 
      RegKey = RegKey.OpenSubKey("SOFTWARE\\Altiris\\Client Service"); 
      object CurrDS = RegKey.GetValue("TcpAddr"); //This line causes the NRE Error 
      MessageBox.Show("Current DS:"); 
     } 
    } 
} 
+4

我強烈建議您以小寫字母開頭。 (例如,'regKey'而不是'RegKey')。 – 2010-10-11 14:28:45

回答

5

如果您確定註冊表項實際存在(使用Regedit.exe),那麼如果您在64位版本的Windows上運行,則會出現問題。 VS2010項目默認情況下被迫以32位模式運行,它會看到另一組註冊表項。

項目+屬性,生成選項卡,平臺目標=任何CPU。重複發佈配置。

+0

+1。 – TalentTuner 2010-10-11 14:44:03

+0

謝謝,我正在64位Windows 7上運行此操作。我將檢查並報告。 – 2010-10-11 14:47:00

+0

我不認爲這是一個選項,這是VS2010 Express,在快遞版本中是否缺少選項? – 2010-10-11 14:52:41

4

我的猜測是,

RegKey = RegKey.OpenSubKey("SOFTWARE\\Altiris\\Client Service"); 

返回一個空,可能是因爲該鍵不存在。

驗證密鑰是否存在以及提供的註冊路徑是否正確。

+0

該路徑完全以HKLM \ SOFTWARE \ Altiris \ Client Service的形式存在,我想要的字符串是TcpAddr。在批處理文件中,這將寫爲REG QUERY「HKLM \ SOFTWARE \ Altiris \ Client Service」/ v TcpAddr – 2010-10-11 14:44:37

0

如果它拋出一個NRE,這是因爲它找不到該值,請確保它拼寫正確,或者上一行不是也返回null

3

根據the documentation for OpenSubKey(),「如果找不到指定的子項,則返回null」。如果一個變量爲null,調用它的方法將拋出該異常。


「是更好的做法是移動的實際查詢出來的單擊事件的,只是讓點擊事件句柄MessageBox.Show()?」

如果將它拿出來,例如,如果其他程序在您的程序運行時修改它,則不一定會反映該鍵的當前值。根據你的程序,這可能沒問題。

+0

此路徑是否需要完整地表示值的路徑?即 - 添加\ TcpAddr到最後? TcpAddr是一個字符串,不是用於引入64位配置通知的密鑰 – 2010-10-11 14:45:54