C# 空引用异常,如何在指定行中发现罪魁祸首

C# null reference exception, how to spot the culprit in the specified line

提问人:user33276346 提问时间:5/2/2020 最后编辑:user33276346 更新时间:5/2/2020 访问量:1166

问:

我们都厌倦了这种例外,但是有没有办法快速找到有问题的东西呢?通常,这种异常会抛出这样的一行:

var myVar = somethingUninitallized.property;

很容易看出,作业的右侧是原因。但是,有时线条很长,如下所示:

var myVar = x.DoSomething(y.FirstDoThis(isThisInitiallized).aProperty, z.ThenDoThis(whatAboutThis).anotherProperty).ComplicatingThings().thisHappensSometimes;

我们在那条线上得到了例外。是的,我们本可以以不同的方式编写代码,但可能我们正在调试其他人的代码,修改它需要重新编译 15 分钟、需要授权或任何其他障碍。这是一个微不足道的例子,我也可以想到 linq,但肯定还有其他更复杂的场景。我通常在 2020 年逐一检查每件事。

是否不可能从调试器工具中获得,或者以某种方式,这是空引用的东西?

C# Visual-Studio 调试 NullReferenceException

评论

1赞 Fildor 5/2/2020
编写 UnitTest。您甚至应该能够“逐步完成”此操作。如果我是你,我宁愿咬一口酸苹果,把它重构成可维护的东西。
4赞 Rufus L 5/2/2020
“是的,我们本可以以不同的方式编写代码”对我来说,这听起来像是一个有效的选择 - 如果您有与示例中给出的代码类似的代码,那么调试将始终是一场噩梦。从长远来看,花几分钟时间使代码更具可读性和可维护性,而不是试图将所有内容塞进一行中,将节省数小时。
1赞 Fildor 5/2/2020
顺便说一句,完全没问题:dotnetfiddle.net/EbiIEB,让你明白的是类似的东西var myVar = somethingUninitallized;var myVar = somethingUninitallized.SomeProperty;
1赞 Rufus L 5/2/2020
@Fildor 更具体一点是行的,但它会产生编译时错误(使用未赋值的变量),而不是(在你的小提琴中,初始化为 )。var myVar = somethingUninitallized;NullReferenceExceptiononull
0赞 Fildor 5/2/2020
@RufusL哎呀,是的。右。但关键是它不会扔,所以。是的,你是对的。

答:

3赞 Rufus L 5/2/2020 #1

下面是从 Thomas Ardel 编写的 Debugging System.NullReferenceException 复制的答案:


在 Visual Studio 中使用 Null 引用分析

如果使用的是 Visual Studio 2017 或更高版本,则可以使用“空引用分析”功能。这样一来,Visual Studio 就可以准确地显示什么是 null。让我们使用这个方法链的例子:

var street = service.GetUser().Address.Street;

要启用分析,请转到“调试”|”视窗 |例外设置。选中公共语言运行时异常(如果尚未选中)或扩展节点并检查您感兴趣的异常。

在这种情况下,可以检查 System.NullReferenceException。运行代码时,调试器会中断,您现在会看到“引发的异常”窗口:NullReferenceException

enter image description here

瞧!窗口显示“ConsoleApp18.User.Address。get 返回 null”。这正是我们想看到的。

评论

0赞 user33276346 5/2/2020
棒!似乎由于某种原因,我的解决方案的调试器无法按预期工作 i.imgur.com/9RYqpfw.png。我在控制台应用程序中测试了它,它在那里工作,所以我必须进一步调查这个问题。