读取注册表项时出现C#NullReferenceException

时间:2010-10-11 14:23:36

标签: c# visual-studio-2010

我在处理按钮点击事件的一些简单代码上遇到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:");
        }
    }
}

4 个答案:

答案 0 :(得分:5)

如果您确定注册表项实际存在(使用Regedit.exe),那么如果您在64位版本的Windows上运行,则会遇到问题。默认情况下,VS2010项目被强制以32位模式运行,它会看到另一组注册表项。

Project + Properties,Build选项卡,Platform Target =任何CPU。重复发布配置。

答案 1 :(得分:4)

我猜是

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

返回null,可能是因为该键不存在。

验证密钥是否存在以及提供的reg路径是否正确。

答案 2 :(得分:3)

根据the documentation for OpenSubKey(),“如果找不到指定的子密钥,则返回null。”如果变量为null,则在其上调用方法将抛出该异常。


“将实际查询移出click事件并将Click事件处理为MessageBox.Show()会更好吗?”

如果你拿出它,它不一定反映键的当前值,例如,如果另一个程序在程序运行时修改它。根据您的计划,这可能没问题。

答案 3 :(得分:0)

如果它正在抛出一个NRE,那是因为它无法找到该值,请确保拼写正确,或者前一行还没有返回null