【问题标题】:What is the cleanest way to compare an int with a potentially null Integer in Java?在 Java 中将 int 与可能为 null 的 Integer 进行比较的最简洁方法是什么?
【发布时间】:2014-10-08 13:57:39
【问题描述】:
Map<String,Integer> m;
m = new TreeMap<String,Integer>();

当 m.get() 为空时,为了避免空指针异常而添加以下强制转换是否是一种好习惯。

System.out.println( ((Integer) 8).equals( m.get("null") ) ); // returns false

或者使用之前的空检查,它开始看起来有点难看。

System.out.println( m.contains("null") != null && m.get("null").equals( 8 ) );

有没有更好的方法来写这个?谢谢。

【问题讨论】:

  • 这取决于还有谁加入 cotillion。

标签: java casting nullpointerexception


【解决方案1】:

== 运算符不比较值,而是比较引用。

您应该使用.equals() 方法,而不是应用于Integer 变量(您确定它不是null 并且不会抛出NPE):

Integer eight = 8; //autoboxed
System.out.println(eight.equals(m.get("null")));

这将打印false,即使m.get("null") 返回null

【讨论】:

    【解决方案2】:

    我尽量避免强制转换,所以我宁愿使用以下,在我看来也更好看:

    Integer.valueOf(8).equals(m.get("null"))
    

    【讨论】:

    • 当然,它们最终会生成基本相同的代码。 “cast”实际上是一个自动装箱指令。
    • @HotLicks 是的,并且将原语转换为其各自的装箱类型甚至是静态类型检查。由于风格原因,我仍然不喜欢它。 OP 代码的更严重问题当然是使用== 来比较Integers 的相等性,正如其他答案所指出的那样。我必须承认,乍一看,我忽略了这一点,只回答了他直接提出的问题,演员阵容是否“被认为是糟糕的风格”(从那时起就编辑了问题)。
    • 是的,我猜他最初使用的是==,但很快就将其删除了。奇怪的是,对于小值正整数,它实际上会起作用,因为它们本质上是“实习的”。
    【解决方案3】:

    不,因为它不起作用。您不能将两个Integer== 进行比较,因为它比较的是引用而不是整数值。在this question中查看更多信息

    您需要一个辅助方法,例如:

    boolean safeIntegerCompare(Integer a, int b)
    {
        if (a != null) 
          return a.intValue() == b;
        return false;
    }
    

    【讨论】:

    • 我不相信他打算这样做(尽管我承认他的全部意图很难预测)。
    【解决方案4】:

    如果只有一个参数可能是null(例如将未知值与常量进行比较时的情况),请像​​这样使用equals()

    Integer foo = Integer.valueOf(8); // you could write Integer foo = 8; here too but I prefer to avoid autoboxing
    if (foo.equals(m.get("x"))) { //will never throw an NPE because foo is never null
       ...
    }
    

    请注意,您的示例通常不会起作用,因为将非原始值与 == 进行比较仅在它们引用相同的对象实例时才返回 true。 (在这种情况下,出于非常具体的原因,这甚至可能是正确的,但大多数情况下并非如此。)

    【讨论】:

    • 这本质上是 OP 提出的。
    • @HotLicks 这不是我写答案的时候,而是 OP 编辑​​的问题。
    • 是的,我同意这个问题从一开始就措辞模糊,他编辑了十几次。这个话题变得很混乱。
    【解决方案5】:

    为了扩展已接受的答案:我发现自己必须检查 2 个可能为空或不为空的整数变量的相等性。

    所以我的解决方案是:

    布尔等于 = Optional.ofNullable(objectA.getNullableInteger()).equals(Optional.ofNullable(objectB.getNullableInteger());

    【讨论】:

      猜你喜欢
      • 2016-01-21
      • 2021-12-02
      • 2011-08-14
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多