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

mad*_*erz 1 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
}
Run Code Online (Sandbox Code Playgroud)

当我运行上面的内容时,我得到了一个,NullPointerException因为该方法在数据库为空selectArtistByName时返回null.我不明白的是为什么if当我得到它时它没有在声明中出现null.所以我做了这个并且它有效:

try {
    if (!selectArtistByName(artist.getName()).equals(artist.getName())) {
    }
} catch (NullPointerException e) {
    m_db.insert(TABLE_ARTIST, null, artistContents);
}
Run Code Online (Sandbox Code Playgroud)

我不是Java大师,但它看起来像是一个可怕的修复程序.我怎么能解决这个问题.

Roh*_*ain 5

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

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

另外,正如@ruakh在评论中正确指出的那样,你的情况似乎已被打破.selectArtistByName听起来像是艺术家,你无法与之比较String.

我想,你甚至不需要第二个条件.我想,selectArtistByName()方法已经对名称进行了等式检查,根据它将返回Artist.只需检查selectArtistByName方法返回null,这就足够了.因此,您应该将if块更改为:

if (selectArtistByName(artist.getName()) == null) {
    //save data to database
}
Run Code Online (Sandbox Code Playgroud)