1

我一直在努力寻找为什么我的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 专家,但它对我来说似乎是一个可怕的修复。我怎么能解决这个问题。

4

2 回答 2

5

您只需要更改if块中的条件顺序:

if (selectArtistByName(artist.getName()) == null || 
   !selectArtistByName(artist.getName()).equals(artist.getName())) {
    //save data to database
}
  • 先做null检查。
  • 如果成功,则不评估第二个条件,因此 no NullPointerException。这就是短路或运算符的工作原理。它只计算第二个表达式,如果一个计算结果为false
  • 如果 null 检查失败,则评估第二个条件,它不会 throw NPE,因为它已经被第一个条件确认。

此外,正如@ruakh 在评论中正确指出的那样,您的状况似乎已被打破。selectArtistByName听起来要返回Artist,这是您无法比较的String

我想,你甚至不需要第二个条件。我假设,selectArtistByName()方法已经完成了name的相等性检查,基于此它将返回Artist。只需检查该selectArtistByName方法 returnnull就足够了。因此,您应该将if块更改为:

if (selectArtistByName(artist.getName()) == null) {
    //save data to database
}
于 2013-08-04T16:49:14.920 回答
1

当艺术家未知时,只需将空条件检查放在快捷方式的开头即可:

if (selectArtistByName(artist.getName())==null || !selectArtistByName(artist.getName()).equals(artist.getName())) {
     //save data to database
}

您可以在另一个问题中找到有关延迟评估的更多信息:Java 有延迟评估吗?

于 2013-08-04T16:53:33.137 回答