为什么这段代码返回错误:java.lang.NullPointerException
Object obj = null;
Long lNull = null;
Long res = obj == null ? lNull : 10L;
但以下方式工作时没有任何错误:
Object obj = null;
Long res = obj == null ? null : 10L;
发生错误是因为在您的情况下,标准要求取消装箱类型的值:
如果第二个和第三个操作数中的一个是基元类型T
,而另一个操作数的类型是对T
应用装箱转换(§5.1.7)的结果,则条件表达式的类型为T
。
在您的情况下,T
是long
,因为10L
是long
而lnull
是long
,即对long
应用装箱转换的结果。
该标准进一步指出
如果需要,则对结果执行解箱转换。
这就是导致异常的原因。请注意,如果反转条件,将不再抛出异常:
Long res = obj != null ? lNull : 10L;
您可以通过显式请求long
而不是使用long
来修复问题,即。
Long res = obj == null ? lNull : Long.valueOf(10L);
在第二种情况下,编译器可以推断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吗?