簡體   English   中英

讀取注冊表項時,C#NullReferenceException

[英]C# NullReferenceException when reading a registry key

我在一些用於處理按鈕單擊事件的簡單代碼上收到NullReferenceException錯誤。 我仍然只需要在最后添加一些代碼,即可在消息框上實際顯示“ TcpAddr”中的值。 這將允許您運行該程序,但是單擊該按鈕會引發該錯誤。

另外:將實際查詢移出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:");
        }
    }
}

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

項目+屬性,“構建”選項卡,平台目標=任何CPU。 重復發布配置。

我的猜測是

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

返回null,可能是因為該鍵不存在。

驗證密鑰存在並且提供的reg路徑正確。

根據OpenSubKey()的文檔 ,“如果找不到指定的子項,則返回null。” 如果變量為null,則在其上調用方法將引發該異常。


“將實際查詢移出click事件並僅使click事件處理MessageBox.Show()是更好的做法嗎?”

如果將其取出,例如在程序運行時另一個程序對其進行了修改,則它不一定反映密鑰的當前值。 根據您的程序,這可能沒問題。

如果拋出NRE,則是因為找不到值,請確保其拼寫正確,或者前一行也不返回null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM