【发布时间】:2012-06-13 19:52:11
【问题描述】:
好的,所以我在这行代码中偶尔会收到 NullReferenceException:
if (!_oracleTenantSettings.OraclePlanSettings.ContainsKey(_key) || _oracleTenantSettings.OraclePlanSettings[_key] == null)
和/或这一行:
_oraclePlanSettings = _oracleTenantSettings.OraclePlanSettings[_key];
OraclePlanSettings 是一个 SortedList,它不能为空,因为有问题的代码被包围:
if (_oracleTenantSettings.OraclePlanSettings != null && _oracleTenantSettings.OraclePlanSettings.Count > 0)
所以我得到了一个 NRE,但整个代码行中没有一个部分可能永远为空。时期。 (感觉到挫败感?)这包括密钥,但无论如何都不会抛出 NRE。我不明白。 VS可能只是放错了CLR异常吗?如果是这样,哪里是开始寻找的好地方?
堆栈跟踪只是一条线:
at company.product.Mvc.OracleSettingsStoreCache.VerifyValueInCacheOrInsert[T](T& returnVal, SettingsType settingType, String tenantId, String planId, String pageMnemonic, String processId, String transcationType, String language, String country, String wapTransactionType, String wapCodeGroup, String wapLoanReasons, String palleteType, Boolean isInsert, Object _cacheValue) in blahblahblah.OracleSettingsStoreCache.cs:line 290
这是整个代码块:
if (!string.IsNullOrEmpty(tenantId) && (!IsWacMode() || (IsWacMode() && settingType == OracleSettingsType.SettingsType.FetchWAPInvestmentTransfer)) && _useCache != "false")
{
tenantId = tenantId.ToUpper().Trim();
_oracleTenantSettings = null;
if (_oracleCacheManager.Contains(_cacheKey))
_oracleTenantSettings = _oracleCacheManager.Get<OracleTenantSetting>(_cacheKey);
if (_oracleTenantSettings != null)
{
if (_oracleTenantSettings.OraclePlanSettings != null && _oracleTenantSettings.OraclePlanSettings.Count > 0)
{
_key = language + "_" + country + "_" + tenantId;
***LINE 290*** if (!_oracleTenantSettings.OraclePlanSettings.ContainsKey(_key) || _oracleTenantSettings.OraclePlanSettings[_key] == null)
{
_objectMissing = TypeOfObjectMissing.TenantObjectDoesNotExist;
}
}
【问题讨论】:
-
您是否在调试器中查看过究竟是什么引发了 NRE?异常可能发生在
OraclePlanSettings属性 getter 内部,它只是在您的代码中浮出水面。 -
你确定那是实际异常的代码行吗?还是堆栈跟踪中的第一行 user 代码?
-
key = language + "" + country + "_" + tenantId;其中所有三个都是包含所有这些代码的方法的输入参数。所以如果那是问题,它会在方法调用上爆炸
-
非常偶尔?这是一个可以被多个线程访问的静态集合吗?像这样的莫名其妙的零星错误通常是线程问题,在测试和访问之间发生变化。
-
RE:“那是 VS 在调试期间捕获 CLR 异常的那一行。但当然堆栈跟踪会说同样的事情”——不,异常堆栈的顶部不一定与视觉工作室报告异常的行相同。检查堆栈。
标签: c# .net exception clr nullreferenceexception