如何知道NullReferenceException的确切位置

时间:2014-03-03 12:03:01

标签: c#

我正在尝试捕获nullreference异常,但我想知道确切的位置(在哪个点或行我得到该异常)。我有一个名为Employee的类,它有两个属性:_Id_Name

static void Main(string[] args)
{
    Employee empobj = new Employee();

    try
    {
        empobj = null;
        //empobj._Id = empobj._Id.ToString();
        Console.WriteLine(empobj._Id);
        Console.WriteLine(empobj._Name);
        Console.ReadLine();
    }
    catch (NullReferenceException e)
    {
        Console.WriteLine("Exception caught: {0}", e.InnerException);
        Console.ReadLine();
    }
}

3 个答案:

答案 0 :(得分:3)

在visual studio中,转到Debug-> Exceptions菜单。

Exceptions dialog

然后选择“Common Language Runtime Exceptions”,选中“Thrown”复选框。这将在抛出异常时中断执行。你可以发现断线就是抛出异常的地方。

如果是NullReferenceException,你将无法获得有关堆栈跟踪的大量帮助,但这样你就可以轻松搞定原因。

答案 1 :(得分:2)

查看堆栈跟踪,它将分解执行树,说明行号以及函数名称等等。您可以通过调试,将异常堆栈跟踪输出到某个介质,或者删除try / catch并让异常停止执行应用程序来完成此操作。

但关键是要解决异常,以便它不会发生,如果是特殊情况(即如果你认为这是一个非常好的情况发生);所以,如果您的应用程序可以检查,例如

if (thing != null) {
  var id = thing.Id;
  if (id != null) {
    var idText = id.ToString();
    // and so on
  }
} else {

} 

在其他地方,你要么继续不同的路线,要让用户重试或其他。

如果它是一个真正特殊的情况(即事情永远不应该为空)并且应用程序如果不能做任何事情,那么让异常发生,它会破坏应用程序。

答案 2 :(得分:2)

堆栈跟踪是可行的方法,但异常来自以下几行:

Console.WriteLine(empobj._Id);
Console.WriteLine(empobj._Name);

您正在将employee对象设置为null

empobj = null;

然后尝试从该类访问成员变量,该变量将不再具有这些变量的值