非常简单的问题,下面的代码抛出一个" Nulllable对象必须有一个值"例外。但我以为那??是要处理那个?
<select id = "select1" name = "select1" onchange="change()">
<option>Select Year...</option>
<option>January</option>
<option>February</option>
<option>March</option>
<option>April</option>
<option>May</option>
<option>June</option>
<option>July</option>
<option>August</option>
<option>September</option>
<option>October</option>
<option>November</option>
<option>December</option>
</select>
<select id = "select2" name = "select2" style = "display:none;">
</select>
答案 0 :(得分:3)
在null
ToString()
Value
属性上调用stop.pallets_qty_total
方法后,您正在检查stop.pallets_qty_total
上返回的结果null
} stop
null
本身也可能是string qty = (stop?.pallets_qty_total?.ToString()) ?? "0";
,这也会导致您的代码失败。
您需要使用 Null-Propogation 运算符尝试以下内容:
from pykeepass import PyKeePass
try:
kp = PyKeePass("info.kdbx", password="12345")
except Exception, e:
print "Got exception",e
lstEntry = kp.find_entries_by_notes(".*Chocolate.*",regex=True)
print lstEntry
print lstEntry[0].notes
答案 1 :(得分:2)
虽然评论已经给出正确答案,但这里有更详细的解释:
你是对的,??
运算符将采用左操作数,它的值不为空。否则它将采用正确的操作数。它是一个简短的版本:
var qty = input == null ? "0" : input;
但是,分配不会抛出异常。调用ToString()
。
如果您的输入为null
,则您的陈述等于以下内容:
var qty = ((object)null).ToString();
这显然会引发NullReferenceException
。
您正在寻找的是?.
运营商。其中说“如果对象不为空则调用函数”。这扩展如下:
input != null ? input.ToString() : null
// is equal to
input?.ToString()
因此,分配的解决方案应该是两个运算符的组合:
var qty = input?.ToString() ?? "0";
答案 2 :(得分:1)
当您没有分配值时,您正尝试访问Value][1]
Nullable<T>
属性。正如规范所说,它将抛出异常:
如果尚未将类型T的值分配给Nullable对象, 你可以将它与null进行比较并检索其HasValue属性,但是你 无法访问其Value属性或调用其他成员。
这里有两个选项 - 如果object为null,则使用null-conditional operator来避免访问对象属性:
string qty = stop.pallets_qty_total?.Value.ToString() ?? "0";
或者您可以记住,数字类型的默认值为零。如果nullable没有赋值,则获取默认值:
string qty = stop.pallets_qty_total.GetValueOrDefault().ToString();
答案 3 :(得分:1)
除了Ehsan Sajjad的回答之外,你实际上并不需要第二个pallets_qty_total
,假设 string qty = stop?.pallets_qty_total.GetValueOrDefault().ToString();
是一个整数。您可以改为使用Nullable.GetValueOrDefault(),如下所示:
pallets_qty_total
如果default(T)
有值,则会返回它。如果没有,它将返回int
,如果是0
,则返回{{1}}。
答案 4 :(得分:0)
它只会检查Value是否为null,但如果object为null,则它会抛出异常。
string qty = stop?.pallets_qty_total?.Value.ToString() ?? "0";