【问题标题】:Can Boolean.valueOf(String) return null?Boolean.valueOf(String) 可以返回 null 吗?
【发布时间】:2014-04-30 16:22:26
【问题描述】:

Boolean.valueOf(String) 可以返回 null 吗?从我在 java docs 中可以看到,文档仅指定它何时返回 true。否则总是返回false,还是可以返回null?在我所做的测试中,我无法让它返回 null,但我想确定一下。

基本上,我想知道以下代码是否可以避免 NullPointerException:

boolean b = Boolean.valueOf(...); 

【问题讨论】:

  • 你为什么不看源码。它只是一条线。在这个论坛上发布问题比查看源代码需要更多时间:)
  • 没有意识到源可用。下次还是谢谢。
  • 请注意,来源可能会有所不同。那里有很多 JVM。

标签: java boolean


【解决方案1】:

文档几乎回答了这个问题:不。它会返回一个Boolean,代表真假。

code is also available:

public static Boolean valueOf(String s) {
    return toBoolean(s) ? TRUE : FALSE;
}

【讨论】:

  • 那么如果它不能返回null...为什么返回对象引用Boolean而不是原始类型boolean?只是好奇原因是什么。
  • Javadocs 没有说明何时引入,但我猜它早于 Java 1.5,其中引入了自动装箱。因此,如果您有一个boolean 并且需要一个Boolean(无论出于何种原因),您将需要手动调用Boolean.valueOf(booleanPrimitive)。整个事情本来是Boolean b = Boolean.valueOf(Boolean.valueOf(myString))。我猜他们认为这是一个足够常见的用例,他们想缩短它。但这都是猜测。
  • 另一方面,如果您需要原语(没有自动装箱),只需Boolean.valueOf(myString).booleanValue(),它没有嵌套,因此更易于阅读。所以基本上,无论哪种方式,他们都不会触及所有用例,所以他们选择了其中一个——或者因为他们认为它更常见,或者因为他们认为它更通用(因为它更容易转换为另一个),或出于其他原因。
  • 不得不三思而后行。规范说'(...)返回一个布尔值(...)'。这隐含地排除了返回的空值,但我认为措辞不够清楚
  • @orique null 不是Booleannull instanceof Boolean 将返回 false。见JLS 4.1There is also a special null type, the type of the expression null
【解决方案2】:

不,这是不可能的。见Boolean类的源码:

public static Boolean valueOf(String s) {
    return toBoolean(s) ? TRUE : FALSE;
}

.. 然后:

private static boolean toBoolean(String name) {
   return ((name != null) && name.equalsIgnoreCase("true"));
}

【讨论】:

    【解决方案3】:

    不,它不会。如果将 null 放在参数中,或者将字符串设置为 null,它将返回布尔值 false。您可以在 Java 文档中看到预期的输入和输出:http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html#booleanValue()

    【讨论】:

      【解决方案4】:

      实际上它可能会导致NPE,但不能返回null。试试这个:

      Boolean bNull = null;
      System.print(Boolean.valueOf(bNull)); // -> NPE!
      

      发生这种情况是因为 Boolean.valueOf() 接受 Stringboolean 值。由于bNullBoolean 类型,java 尝试将bNull 值拆箱以将其作为boolean 传递,这会导致NPE。它很有趣但实际上很愚蠢......而且Number也没有Boolean.valueOf()

      【讨论】:

        猜你喜欢
        • 2012-07-06
        • 2016-10-17
        • 2010-11-10
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多