我目前正在阅读Poornachandra Sarang的Java编程,并对Java Swing中JList
的getSelectedValue()
函数的使用有疑问。
我注意到source.getSelectedValue() != null
(其中source
是JList
)不仅检查了一次,在被铸造成字符串之后再次检查,如str != null
所示。
鉴于此,(String)
等演员是否有可能将变量变为null
值?
public void actionPerformed(ActionEvent evt) {
if (evt.getSource().equals(addButton)) {
if (source.getSelectedValue() != null) {
String str = (String) source.getSelectedValue();
if(str != null) {
destModel.addElement(str);
dest.setSelectedIndex(0);
sourceModel.removeElement(str);
source.setSelectedIndex(0);
}
}
}
}
诸如(String)之类的强制转换是否有可能将变量变为空值?
不,绝对不是。 (String) someObject
给你null
的唯一方法是someObject
的价值已经是null
。
但是......
可以想象,以下可以将null
分配给str
。
if (source.getSelectedValue() != null) {
String str = (String) source.getSelectedValue();
在多线程上下文中(实际上,Swing UI通常是多线程的!),另一个线程可以改变source
,而这是代码正在执行,以便第一次和第二次调用getSelectedValue()
返回不同的值。这是否是一个实际问题(以及可能的解决方案)将取决于更大的图景。
部分解决方案(即针对特定竞争条件)将重写代码的这一部分,如下所示:
Object selected = source.getSelectedValue();
if (selected != null) {
String str = (String) selected;
// ...
}
但是,这并不一定能解决其他潜在的竞争条件。
鉴于此,诸如(String)之类的强制转换是否有可能将变量变为空值?
不,一旦你走得那么远,你可以放心,source.getSelectedValue()
永远不会是空的。
此外,第二次空检查是多余的,可以删除。
希望这能回答你的问题 :)