【问题标题】:How can a variable be null in this piece of code?这段代码中的变量如何为空?
【发布时间】:2015-05-04 07:10:37
【问题描述】:

FindBugs 抱怨 在此方法中 Comparator.compareStrings(String, String) 中分支上 str1 的可能空指针取消引用可能是不可行的:

private static int compareStrings(final String str1, final String str2) {
    if ((str1 == null) && (str2 == null)) {
        return COMPARE_ABSENT;
    }
    if ((str1 == null) && (str2 != null)) {
        return COMPARE_DIFFERS;
    }
    if ((str1 != null) && (str2 == null)) {
        return COMPARE_DIFFERS;
    }
    return str1.equals(str2) ? COMPARE_EQUALS : COMPARE_DIFFERS;
}

在 Eclipse 中,我还在最后一行看到警告(str1 可能为空)。

str1 在什么情况下可以在return str1.equals(str2) ? COMPARE_EQUALS : COMPARE_DIFFERS; 中成为null(假设前两个 if 块涵盖了这种情况,当str1 为空时)?

【问题讨论】:

  • 不能,但 Eclipse 不够聪明,无法分辨。
  • (另外,为什么不直接使用Objects.equals?)
  • 不相关但是:第二个和第三个if可以合并为一个:if (str1 == null || str2 == null) return COMPARE_DIFFERS;
  • @blackOcean 不,equals 和 == 做不同的事情。我的意思是提问者的 整个方法java.util.Objects.equals(Object, Object) 完全相同(不要与java.lang.Object.equals(Object) 混淆)
  • @Eran,好像它被自动标记了。投票支持重新开放。

标签: java findbugs


【解决方案1】:

您可以通过重新排列 if 语句来避免警告:

private static int compareStrings(final String str1, final String str2) {
    if (str1 == null) {
        if (str2 == null)) {
            return COMPARE_ABSENT;
        } else {
            return COMPARE_DIFFERS;
        }
    } else {
        if (str2 == null)) {
            return COMPARE_DIFFERS;
        } else {
            return str1.equals(str2) ? COMPARE_EQUALS : COMPARE_DIFFERS;
        }
    }
}

【讨论】:

  • 返回 str1 == null ? (str2 == null ? COMPARE_ABSENT : COMPARE_DIFFERS) : (str1.equals(str2) ? COMPARE_EQUALS : COMPARE_DIFFERS);// 更简短的回答
  • @Harry.Chen 但它更具可读性吗?我想这是一个见仁见智的问题:)
【解决方案2】:

在您调用str1.equals(str2) 时,str1 不能成为null。您应该在该位置取消此警告。

【讨论】:

    猜你喜欢
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 2019-10-30
    • 2016-06-19
    • 1970-01-01
    相关资源
    最近更新 更多