条件 TryGetValue 引发"Object reference not set to an instance of an object."异常



我有一个MVC中的web方法。NET应用程序,该应用程序接受来自AJAX调用的json数据字符串,以便在数据库中更新

数据是一个对象数组,是两种包类型之一。我检查它是哪种包类型,然后将字符串反序列化为该类。所以函数看起来像这样:

public JsonResult SaveData (string jsonIn)
{
string rtnStr = "";
bool hasChanges = false;
using (var db = new MyDBContext())
{
JArray packages = JArray.Parse(jsonIn);
foreach (JObject package in packages.Children<JObject>())
{
string packageType = "Unknown";
if (package != null & package.TryGetValue("DataType", out JToken value))
{
packageType = value.ToString();
}
if (packageType == "PackageTypeA")
{
PackageTypeA pkgTypeA = JsonConvert.DeserializeObject<PackageTypeA>(package.ToString());
//do some things
} 
else if (packageType == "PackageTypeB") {
PackageTypeB pkgTypeB = JsonConvert.DeserializeObject<PackageTypeB>(package.ToString());
//do something else
}
}
}
}

我在这一行的错误日志中偶尔会出现异常,特别是:packageType = value.ToString();:

Message: Object reference not set to an instance of an object.
Stack Trace: 
at MyApp.Controllers.PlansController.SaveData(String jsonIn) in C:homeprojectsdotNetMyAppMyAppControllersPlansController.cs:line 257
at lambda_method(Closure , ControllerBase , Object[] )
at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
at System.Web.Mvc.Controller.ExecuteCore()
at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)
at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext)
at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<>c__DisplayClassb.<BeginProcessRequest>b__5()
at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0()
at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
at System.Web.Mvc.MvcHandler.<>c__DisplayClasse.<EndProcessRequest>b__d()
at System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f)
at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)
at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step)
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

作为一个布尔方法,package.TryGetValue("DataType", out JToken value)不应该等于false吗?这样,如果DataType为null,就不会执行packageType = value.ToString();吗?

package != null & package....这是您的问题。package为null,但您尝试访问它的TryGetValue方法。

相反,使用&&:

if (package != null && package.TryGetValue("DataType", out JToken value))

甚至更好(至少更短(:

if (package?.TryGetValue("DataType", out JToken value) ?? false)

相关内容

最新更新