java - 使用 try catch 而不是 if 语句查找 NullPointerException 时遇到问题

标签 java

我一直在努力寻找为什么我的 if 语句不能正常工作,所以我改用了 try catch block 。这是我的 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 block 中的条件顺序:

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

此外,正如@ruakh 在评论中正确指出的那样,您的情况似乎已被打破。 selectArtistByName 听起来返回一个 Artist,您无法将其与 String 进行比较。

我想,您甚至不需要第二个nd 条件。我会假设,selectArtistByName() 方法已经对 name 进行了相等性检查,它将基于此返回 Artist。只需检查 selectArtistByName 方法是否返回 null,就足够了。因此,您应该将 if block 更改为:

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

关于java - 使用 try catch 而不是 if 语句查找 NullPointerException 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18045212/

相关文章:

java - 是否可以使用 Netbeans 在 websphere 上进行热部署?

java - Java 中的泛型函数

java - 使用eclipse将.xml文件转换为java中的.json文件?

java - 无限 while 循环? - 出现终止按钮

java - 我无法将 Servlet 映射到 JSP

java - 是否可以添加库项目的 JAR 文件并在另一个项目中使用其资源?

java - 找到最长的公共(public)前缀?

java - 使用链接 HashMap 删除选定的项目

java - 二维数组随机索引乐透游戏

java - Java 6 和 Java 7(Oracle Jdk) 中字符串文字的垃圾收集