[英]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.