查找NullPointerException时出现问题,使用了try-catch而不是if语句



我一直在努力寻找为什么我的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有懒惰评估吗?

最新更新