我一直在努力寻找为什么我的if
语句不能正常工作,所以我使用了try catch
块。这就是我的if语句:
//selectArtistByName returns an Artist object
if (!selectArtistByName(artist.getName()).equals(artist.getName()) ||
selectArtistByName(artist.getName())==null) {
//save data to database
}
当我运行上面的时,我得到了一个NullPointerException
,因为方法selectArtistByName
在数据库为空时返回null
。我不明白的是,当我得到null
时,为什么它没有出现在if
语句中。所以我做了这个,它起了作用:
try {
if (!selectArtistByName(artist.getName()).equals(artist.getName())) {
}
} catch (NullPointerException e) {
m_db.insert(TABLE_ARTIST, null, artistContents);
}
我不是Java大师,但这对我来说是一个可怕的修复。我该怎么修复呢。
您只需要更改if
块中条件的顺序:
if (selectArtistByName(artist.getName()) == null ||
!selectArtistByName(artist.getName()).equals(artist.getName())) {
//save data to database
}
- 首先进行
null
检查 - 如果成功,则不评估2nd条件,因此不评估
NullPointerException
。这就是短路OR运算符的工作方式。它只计算2nd表达式,如果1st计算结果为false - 如果null检查失败,则评估2nd条件,这不会抛出
NPE
,因为第一个条件已经确认了这一点
此外,正如@ruakh在评论中正确指出的那样,你的病情似乎已经恶化。selectArtistByName
听起来像是在返回一个艺术家,这是String
无法比拟的。
我想,你甚至不需要2nd条件。我假设selectArtistByName()
方法已经对名称进行了相等性检查,并将根据该检查返回艺术家。只要检查selectArtistByName
方法是否返回null
就足够了。因此,您应该将if
块更改为:
if (selectArtistByName(artist.getName()) == null) {
//save data to database
}
当艺术家未知时,只需将空条件检查放在快捷方式的开头:
if (selectArtistByName(artist.getName())==null || !selectArtistByName(artist.getName()).equals(artist.getName())) {
//save data to database
}
您可以在另一个问题中找到更多关于懒惰评估的信息:Java有懒惰评估吗?