【问题标题】:Why I am getting NullPointerException in my ternary operator?为什么我在三元运算符中得到 NullPointerException?
【发布时间】:2019-10-08 20:53:03
【问题描述】:

即使我明确检查列表的值是否为null,我的三元运算符仍在抛出NullPointerException。但是,如果我在三元运算符周围添加括号,我的代码就可以工作。

不带括号的代码(抛出异常):

final List<String> listData = null;
System.out.println("Insert new data (Created Monitorings) : " + 
        listData != null ? listData.size() : 0);

带括号的代码(工作正常):

final List<String> listData = null;
System.out.println("Insert new data (Created Monitorings) : " + 
        (listData != null ? listData.size() : 0));

谁能解释一下它是如何工作的。

【问题讨论】:

  • NullPointerException 不是编译错误
  • @GhostCat 是的!!!谢谢你:)

标签: java nullpointerexception ternary-operator


【解决方案1】:

'+' 的优先级高于 '!='

因此片段 1 转换为:

(("插入新数据(创建的监控):" + listData) != null ? listData.size() : 0;

表达式不为空,因此它继续执行 listData.size()。但是因为它为null,所以会抛出异常。

【讨论】:

    【解决方案2】:

    这大约是 precedence 的运算符:String+ 的优先级比以下三元运算符高得多。

    因此,您的第一个 sn-p 实际上是这样做的:

    ( "Insert new data (Created Monitorings) : " + listData ) != null 
      ? listData.size() : 0
    

    含义:你连接一个字符串(带有一个空listData),并将它与空进行比较。显然,连接的字符串不为空。因此,您确实拨打了listData.size()。这类似于 null.size() 导致您的 NullPointerException。

    您正在将 错误 事物与 null 进行比较!在第二个 sn-p 中,(括号)确保三元运算的结果被添加到您的字符串中。

    【讨论】:

      【解决方案3】:

      在sn-p中,与null比较的值为"Insert new data (Created Monitorings) : " + listData

      【讨论】:

        猜你喜欢
        • 2023-03-13
        • 2019-02-08
        • 2023-03-12
        • 2023-02-03
        • 2016-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-28
        相关资源
        最近更新 更多