如何找出导致NullReferenceException的确切原因

时间:2011-08-15 12:36:16

标签: c# visual-studio visual-studio-2010

所以我正在制作一个应用程序,一切运行良好,直到发生以下情况:

NullReferenceException

我已经检查了调试器,但我找不到导致此异常的确切原因。我有一种感觉,根本原因是在SQL方面,因为这是我最近改变的唯一部分,但我需要知道NullReferenceException的确切位置,以便知道SQL代码到底是什么固定。

这是一个堆栈跟踪,如果有帮助(我不希望你们知道究竟是什么导致了NullReferenceException,我似乎无法找到它并且我完全迷失了):

[NullReferenceException: Object reference not set to an instance of an object.]
   iTextSharp.text.pdf.PdfPRow.CopyContent(PdfPRow copy) +124
   iTextSharp.text.pdf.ColumnText.GoComposite(Boolean simulate) +8178
   iTextSharp.text.pdf.ColumnText.Go(Boolean simulate) +203
   iTextSharp.text.pdf.ColumnText.Go() +33
   iTextSharp.text.pdf.PdfDocument.AddPTable(PdfPTable ptable) +426
   iTextSharp.text.pdf.PdfDocument.Add(IElement element) +7594
   iTextSharp.text.Document.Add(IElement element) +394
   BigYOperationsConsole.Helpers.PdfHelper.ChecklistPdfStream(Checklist cl) in C:\workspace\BigYOperationsConsole\Helpers\PdfHelper.cs:129
   BigYOperationsConsole.Controllers.ChecklistsController.ExportPDF(Int32 id) in C:\workspace\BigYOperationsConsole\Controllers\ChecklistsController.cs:776
   lambda_method(Closure , ControllerBase , Object[] ) +150
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +51
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +409
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +52
   System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +127
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +436
   System.Web.Mvc.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14() +61
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +305
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +830
   System.Web.Mvc.Controller.ExecuteCore() +136
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +232
   System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +39
   System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +68
   System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +44
   System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +42
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +141
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +54
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
   System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +61
   System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +31
   System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +56
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +110
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +690
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +194

更新:这似乎是iTextSharp 5.0.6中的colspans错误。我升级到5.1.1,现在一切正常。有关详细信息,请参阅下面的评论。奇怪的是,一切都在使用5.0.6 ......

3 个答案:

答案 0 :(得分:3)

我会做以下事情:

首先,按如下所述调整VS:

1)转到Debug - &gt; Exceptions对话框并检查Common Language Runtime Exceptions并选中Thrown列中的复选框;

2)转到工具 - &gt;选项 - &gt;调试并取消选中启用我的代码(仅管理)复选框。

现在运行该项目并尝试重现此问题。上面的设置应该强制调试器停止在抛出异常的方法。如果您不拥有此库的源,请使用Reflector分析此方法的代码。希望,这有帮助。

答案 1 :(得分:0)

当您尝试调用doc方法时,.add变量为null。需要查看其余的方法或更多代码来找出原因。

答案 2 :(得分:0)

当对象本身为null时,尝试访问对象成员时抛出NullReferenceException。 doc变量是设置为对象的实例还是为空?也可能1)checklistTable为null或2)checklistTable的引用类型成员之一为null。如果其中任何一个都是真的并且doc对象的.Add()方法中的代码正在尝试引用这样的成员,那么你将获得该异常。

另一个很好的调试技巧是转到Windows&gt;调试&gt;堆栈跟踪。当您遇到异常时,您实际上可以向后跟随调用堆栈并查看每个调用的范围以查看什么是null。

编辑好的,所以checklistTable不能为null或者你之前得到一个异常(我没有看好你的代码)。但是,其中一个成员仍然可以为null,如果在.Add()方法中引用该成员的一个成员,则会得到该异常。