【问题标题】:trouble finding NullPointerException used try catch instead of if statement找不到 NullPointerException 使用 try catch 而不是 if 语句
【发布时间】:2013-08-04 16:47:52
【问题描述】:

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

【问题讨论】:

    标签: java


    【解决方案1】:

    你只需要改变if块中的条件顺序:

    if (selectArtistByName(artist.getName()) == null || 
       !selectArtistByName(artist.getName()).equals(artist.getName())) {
        //save data to database
    }
    
    • 先检查null
    • 如果成功,则不会评估 2nd 条件,因此不会评估 NullPointerException。这就是 short-circuit OR 运算符的工作原理。它只计算 2nd 表达式,如果 1st 一个计算结果为 false
    • 如果空值检查失败,则评估第二个nd条件,它不会抛出NPE,因为它已被第一个条件确认。

    此外,正如@ruakh 在评论中正确指出的那样,您的状况似乎已被打破。 selectArtistByName 听起来像是在返回一个艺术家,这是你无法与String 相比的。

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

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

    【讨论】:

    • +1,但应该注意这里还有另一个问题:selectArtistByName(artist.getName()).equals(artist.getName()) 不太可能是真的,因为selectArtistByName(artist.getName()) 是一个Artistartist.getName() 大概是一个@ 987654337@。 (不过,我不确定条件应该是什么样的。)
    • @ruakh。啊!接得好。将其添加到答案中。 :)
    【解决方案2】:

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

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

    您可以在另一个问题中找到有关惰性评估的更多信息:Does Java have lazy evaluation?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 2018-01-27
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多