2

在尝试修复 Null 值时,我遇到了 C# 问题(我是新手)。因此,我有一个变量“verif”(String verif = String.Empty;),我用它从 Windows 注册表中读取一些键。如果密钥存在,我的代码可以工作,但是当它不存在时,我收到错误“NullReferanceException 未处理”。我尝试了几种方法来捕获异常,放置一个“If”语句,但我失败了。我的代码是这样的:

RegistryKey key_user;
RegistryKey key_pwd;
String code = String.Empty;
String tara = String.Empty;
String tot = String.Empty;
String pwd_mdw = String.Empty;
String user_mdw = String.Empty;
String user_uca = String.Empty;
String pwd_uca = String.Empty;
String verif = String.Empty;     
private void button1_Click(object sender, EventArgs e)
{tot = listBox1.SelectedValue.ToString();
//MessageBox.Show(tot);
tara = tot.Substring(tot.Length - 2, 2);
//MessageBox.Show(tara);
code = listBox1.SelectedValue.ToString().Substring(0, 2);
user_mdw = textBox1.Text;
//MessageBox.Show(user_mdw);
pwd_mdw = textBox2.Text;
//MessageBox.Show(pwd_mdw);        
if (code == "CC")
{
verif = Registry.CurrentUser.OpenSubKey(@"Software\TDCredentials").GetValue("user_mdw_" + tara + "_CC").ToString();
MessageBox.Show("Verif",verif);
MessageBox.Show(user_mdw, "user_mdw");
if (verif==null)
{
key_user = Registry.CurrentUser.CreateSubKey("Software\\TDCredentials");
key_user.SetValue("user_mdw_" + tara + "_CC", user_mdw);
key_user.Close();
key_pwd = Registry.CurrentUser.CreateSubKey("Software\\TDCredentials");
key_pwd.SetValue("pass_mdw_" + tara + "_CC", pwd_mdw);
key_pwd.Close();
MessageBox.Show("User and Password inserted successfully!");
textBox1.Clear();
textBox2.Clear();
}
else
{...

有什么提示吗?非常感谢,博格丹。

4

5 回答 5

3

首先你需要检查

Registry.CurrentUser.OpenSubKey(@"Software\TDCredentials")

这不是空的。然后调用getvalue方法。因为如果上面的键为空,那么下面的 getvalue 将抛出异常。

于 2013-08-20T06:26:43.270 回答
3

看看您要做什么,这条线很可能是您的问题之一;

verif = Registry.CurrentUser.OpenSubKey(@"Software\TDCredentials")
            .GetValue("user_mdw_" + tara + "_CC").ToString();

如果键不存在,OpenSubKey将返回 null,并且您GetValue()无需检查即可调用它。

您可以更改该行以添加支票,例如;

var key = Registry.CurrentUser.OpenSubKey(@"Software\TDCredentials");
var value = key != null ? key.GetValue("user_mdw_" + tara + "_CC") : null;
verif = value != null ? value.ToString() : null;

if(verif == null) { 
...
于 2013-08-20T06:27:04.250 回答
0

尝试以下检查以测试它Registry.CurrentUser.OpenSubKey(@"Software\TDCredentials")是否null会爆炸:

 if (code == "CC")
        {
            if (Registry.CurrentUser.OpenSubKey(@"Software\TDCredentials") != null)
            {
                verif =
                    Registry.CurrentUser.OpenSubKey(@"Software\TDCredentials").GetValue("user_mdw_" + "Test" + "_CC").
                        ToString();

            }
于 2013-08-20T06:29:08.253 回答
0

您试图在一行中做太多事情,而没有随时检查结果。

首先,正如其他人已经说过的那样,您需要检查它OpenSubKey是否不返回 null。您还需要确保完成后密钥已关闭,并使用以下using语句:

using (var key = Registry.CurrentUser.OpenSubKey(@"Software\TDCredentials"))
{
    if (key == null)
    {
        // Couldn't open the key, now what?
        // You need to make a decision here.
        // If you read the documentation for CreateSubKey,
        // you'll see that it can *also* return null, so don't rely on it.
    }
    else
    {
        // OK, opened the key, and the using statement will close it.
        // Now we can try reading values. See the next part of the answer.
    }
}

如果您成功打开密钥,您可以尝试读取该值。即使您成功打开密钥,该值也可能不存在,或者它可能不是字符串(例如,它可能是 DWORD 或二进制值)。

  • 如果该值不存在,则GetValue返回 null,因此ToString不检查的调用将抛出NullReferenceException
  • 即使该值存在,调用ToString它也是错误的做法,因为它可能不是注册表中的字符串值。例如,如果它是一个二进制值,调用ToString它会给你字符串System.Byte[]。您需要检查它实际上是一个字符串。
else
{
    // OK, opened the key, and the using statement will close it.
    // Now we can try reading values.
    string verif = key.GetValue("user_mdw_" + tara + "_CC") as string;
    if (verif == null)
    {
        // The value does not exist, or is not the type you expected it to be (string).
        // Now what? You need to make a decision here.
    }
    else
    {
        // OK, do something with verif.
    }
}

请务必阅读这些方法的文档,并处理它们提到的特殊情况,尤其是它们返回 null 的情况:

于 2013-08-20T08:41:58.010 回答
0

在使用 ToString() 方法之前,尝试检查 OpenSubKey() 和 GetValue() 方法上的 NULL。

于 2013-08-20T06:31:43.063 回答