C# system.nullreferenceexception: 未将对象引用设置到对象的实例

publicstaticStringProductKey{get{returnDecodeProductKey(GetRegistryDigitalProductId);... public static String ProductKey { get { return DecodeProductKey(GetRegistryDigitalProductId); } }
private static Byte[] GetRegistryDigitalProductId
{
get
{
try
{
byte[] digitalProductId = null;
RegistryKey registry = null;
registry = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", false);

if (registry != null)
{
digitalProductId = registry.GetValue("DigitalProductId") as byte[];
registry.Close();
}
return digitalProductId;
}
catch (Exception excep)
{
return null;
}
}
}
private static String DecodeProductKey(Byte[] digitalProductId)
{
const int keyStartIndex = 52;
const int keyEndIndex = keyStartIndex + 15;
char[] digits = new char[]
{
'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'M', 'P', 'Q', 'R',
'T', 'V', 'W', 'X', 'Y', '2', '3', '4', '6', '7', '8', '9',
};
const int decodeLength = 29;
const int decodeStringLength = 15;
char[] decodedChars = new char[decodeLength];
ArrayList hexPid = new ArrayList();
for (int i = keyStartIndex; i <= keyEndIndex; i++)
{
hexPid.Add(digitalProductId);
}
for (int i = decodeLength - 1; i >= 0; i--)
{
// Every sixth char is a separator.
if ((i + 1) % 6 == 0)
{
decodedChars[i] = '-';
}
else
{
int digitMapIndex = 0;
for (int j = decodeStringLength - 1; j >= 0; j--)
{
int byteValue = (digitMapIndex << 8) | (byte)hexPid[j];
hexPid[j] = (byte)(byteValue / 24);
digitMapIndex = byteValue % 24;
decodedChars[i] = digits[digitMapIndex];
}
}
}
return new string(decodedChars);
}
#endregion PRODUCT KEY

以上代码在编译器里顺利通过,但是实际运行时报错,我debug了一下,发现是byteValue和digitMapIndex的问题,值为0....请问如何修改上述代码????
展开
 我来答
天堂画家
2017-12-26 · 超过50用户采纳过TA的回答
知道小有建树答主
回答量:65
采纳率:91%
帮助的人:46.1万
展开全部

1.主要问题还是在这里,这个digitalProductId没有获取到值,因此是null

2.而这个变量的值作为参数传递到了DecodeProductKey()方法。这下子问题就出现了,因为这个的值是null,所以执行完for循环内的hexPid.Add(digitalProductId);后通过调试也发现,hexPid里的值也全是null。

3.因此执行int byteValue = (digitMapIndex << 8) | (byte)hexPid[j];时报错说未将对象引用设置到对象的实例。实际上就是因为(byte)hexPid[j]这部分是null的原因。

4.解决方法:通过观察GetValue()方法的注释发现,因为注册表里不存在名称/值对,所以才返回null。因此去看一下注册表里的这个值是否存在吧。

5.PS:以上操作只是我复制代码后直接操作的,所以我的注册表什么的都是原样,可能对代码会存在一些影响。但我给出的问题大概存在位置是可以确定的。一个小技巧:通常报“未将对象引用设置到对象的实例”,多半是某个变量或对象的值为null。

新宇笑
2017-12-29 · TA获得超过906个赞
知道小有建树答主
回答量:680
采纳率:46%
帮助的人:105万
展开全部
兄弟,你慢慢调吧,设断点。值为0应该不会报这个错,为null才会报
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式