我一直在努力找到为什么我的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
。我不明白的是,当我得到if
时,为什么它没有进入null
声明。所以我做了这个并且它有效:
try {
if (!selectArtistByName(artist.getName()).equals(artist.getName())) {
}
} catch (NullPointerException e) {
m_db.insert(TABLE_ARTIST, null, artistContents);
}
我不是Java大师,但对我来说这看起来像是一个可怕的修复。我怎么能解决这个问题。
答案 0 :(得分:5)
您只需要更改if
块中的条件顺序:
if (selectArtistByName(artist.getName()) == null ||
!selectArtistByName(artist.getName()).equals(artist.getName())) {
//save data to database
}
null
检查。NullPointerException
。这就是短路OR 运算符的工作原理。它仅评估2 nd 表达式,如果1 st 一个评估为 false 。NPE
,因为它已经被第一个条件确认。另外,正如@ruakh在评论中正确指出的那样,你的病情似乎已被打破。 selectArtistByName
听起来要返回艺术家,您无法与String
进行比较。
我想,你甚至不需要2 nd 条件。我认为,selectArtistByName()
方法已经对 name 进行了等式检查,根据它将返回 Artist 。只需检查selectArtistByName
方法返回null
,这就足够了。因此,您应该将if
块更改为:
if (selectArtistByName(artist.getName()) == null) {
//save data to database
}
答案 1 :(得分:1)
当艺术家未知时,只需将空条件检查放在开头的快捷方式:
if (selectArtistByName(artist.getName())==null || !selectArtistByName(artist.getName()).equals(artist.getName())) {
//save data to database
}
您可以在其他问题中找到有关延迟评估的更多信息:Does Java have lazy evaluation?