发现NullPointerException时遇到问题,请使用try catch而不是if语句

时间:2013-08-04 16:47:53

标签: java

我一直在努力找到为什么我的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大师,但对我来说这看起来像是一个可怕的修复。我怎么能解决这个问题。

2 个答案:

答案 0 :(得分:5)

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

if (selectArtistByName(artist.getName()) == null || 
   !selectArtistByName(artist.getName()).equals(artist.getName())) {
    //save data to database
}
  • 先进行null检查。
  • 如果成功,则不评估2 nd 条件,因此没有NullPointerException。这就是短路OR 运算符的工作原理。它仅评估2 nd 表达式,如果1 st 一个评估为 false
  • 如果空检查失败,则评估2 nd 条件,这不会抛出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?

相关问题