我在下面的代码中遇到了 NullPointerException,因为它很少发生,我尝试调试以重现该问题,但没有成功。任何人都可以帮助我在这里导致 NullPointerException 的原因。
private static void MyTaskCompletedCallback(IAsyncResult res)
{
var worker = (AsyncErrorDelegate)((AsyncResult)res).AsyncDelegate;
var async = (AsyncOperation)res.AsyncState;
worker.EndInvoke(res);
lock (IsAsyncOpOccuring)
{
IsBusy = false;
}
var completedArgs = new AsyncCompletedEventArgs(null, false, null);
async.PostOperationCompleted(e => OnTaskCompleted((AsyncCompletedEventArgs)e), completedArgs);
}
空指针异常报告于 var async = (AsyncOperation)res.AsyncState;
我调用它的地方的代码
var context = HttpContext.Current;
AsyncErrorDelegate bkWorker = SendErrorMail;
AsyncCallback completedCallback = MyTaskCompletedCallback;
lock (IsAsyncOpOccuring)
{
if (IsBusy)
{
//Do we need to do something if repeated async getting call in case of error occuring at same time by different users.
}
AsyncOperation async = AsyncOperationManager.CreateOperation(null);
bkWorker.BeginInvoke(context,completedCallback, async);
IsBusy = true;
}
最佳答案
Null Pointer exception is reported at
var async = (AsyncOperation)res.AsyncState;
我们可以从逻辑上推断,事实并非如此。
如果前面的行有效,我们知道 res
不为空。 AsyncState
是 object
,因此这里不涉及自定义运算符,这意味着转换因此是一种类型检查 - 它可以返回 null
(没有错误),或者可以引发无效转换异常。
如果您看到 NullReferenceException
,则还有 2 个选项:
res
为 null 并且是 上面的行 出错(这:我们实际上不应该期望 - 这不会发生)- 错误实际上来自
EndInvoke
,之后
(当涉及异常时,确切的行经常会有点困惑)。
我建议您在每个之间添加日志记录,以跟踪正在发生的事情。我还建议您在 EndInvoke
周围明确地try
,因为它会抛出异常(它会重新抛出异步操作中的任何异常)。
在更一般的情况下,第三种选择是:
AsyncOperation
是一个struct
,AsyncState
是null
但是,在这种情况下,我们可以通过推论来排除这种情况,因为如果 AsyncOperation
是一个 struct
,则以下内容永远不会框到null
(只有一个空的 AsyncOperation?
才会装箱到 null
):
AsyncOperation async = AsyncOperationManager.CreateOperation(null);
bkWorker.BeginInvoke(context,completedCallback, async);
关于c# - C#中的空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13491758/