当前位置: 首页 > 知识库问答 >
问题:

当返回的对象之一为null[duplicate]时,If语句返回NullPointerException的Java的缩写形式

景同
2023-03-14

为什么这段代码返回错误:java.lang.NullPointerException

Object obj = null;
Long lNull = null;
Long res = obj == null ? lNull : 10L;

但以下方式工作时没有任何错误:

Object obj = null;
Long res = obj == null ? null : 10L;

共有2个答案

经嘉
2023-03-14

发生错误是因为在您的情况下,标准要求取消装箱类型的值:

如果第二个和第三个操作数中的一个是基元类型T,而另一个操作数的类型是对T应用装箱转换(§5.1.7)的结果,则条件表达式的类型为T

在您的情况下,Tlong,因为10Llonglnulllong,即对long应用装箱转换的结果。

该标准进一步指出

如果需要,则对结果执行解箱转换。

这就是导致异常的原因。请注意,如果反转条件,将不再抛出异常:

Long res = obj != null ? lNull : 10L;

您可以通过显式请求long而不是使用long来修复问题,即。

Long res = obj == null ? lNull : Long.valueOf(10L);
督飞羽
2023-03-14

在第二种情况下,编译器可以推断null必须是long类型。在第一种情况下,它没有--并且假设表达式返回long。您可以看到这种情况(即修复它)就像,

Long res = obj == null ? lNull : (Long) 10L;

它不会产生NullPointerException。

 类似资料:
  • 我有以下JPQL查询: 这应该返回所有对具有NULL的。 但是,我正在运行代码并进行调试,我看到返回的集合包含此字段为null的实体。 这是JPQL中的错误吗?

  • 如何在这种类型的返回语句中添加if语句: 显然,我不能直接在中删除if语句。

  • 问题内容: 为什么这给了我一个丢失的退货陈述错误?每个if / else都有返回值,最后一个括号出现错误 问题答案: 每个语句都在一个语句内。虽然从逻辑上讲这是不可能的,但是当所有评估都不为真时,编译器需要返回。 我建议: 我认为,此解决方案可解决编译器问题并稍微提高可读性。 或者,有以下解决方案: 引发异常将使你可以退出方法而无需返回任何信息……因为可以说,如果到达最后一个,显然会出错。

  • 问题内容: 我知道有一种写简短形式的Java 语句的方法。 有谁知道如何将上述5行的缩写写成一行? 问题答案: 使用三元运算符: 我认为您的条件倒退了-如果为空,则希望该值为“ N / A”。 如果城市为空怎么办?在这种情况下,您的代码*打了床。我还要添加另一张支票:

  • 有人能用简单的英语解释一下这句话背后的逻辑吗? 假设mContainsLoadingRow为布尔值,如果< code>mContainsLoadingRow为< code>true, 然后返回< code > getContentDataSize()1 。 如果没有,则返回 这是正确的看待方式吗?

  • 在单元测试(Groovy和Spock)的中,我用mock填充上面的字段: 接下来,在我的测试用例中,我调用一个方法,我希望从中获取,该方法来自步骤中的模拟对象: 问题是,对于,我将获得。 这是因为我以错误的方式使用Groovy吗?如何使成为它应该成为的对象?我应该使用mock/stub吗?