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

使用时令人惊讶的NullPointerException?:[duplicate]

巫经义
2023-03-14
Integer oddity(boolean b1, boolean b2) {
  return b1 ? 0 : b2 ? 1 : null;
}
Integer oddity(boolean b1) {
  return b1 ? 0 : null;
}

这是为什么?

共有1个答案

华季萌
2023-03-14

可以想象,第一种情况下的NullPointerException是隐式解装箱的结果。这一切都如JLS第15.25节所述;但这些规则很复杂,有一些棘手的方面。

令人惊讶的是:

System.out.println(b ? 0 : null);

并不等同于

Integer v = null;
System.out.println(b ? 0 : v);
    null
return Integer.valueOf(b1 ? 0 : (b2 ? Integer.valueOf(1) : null).intValue());
return b1 ? Integer.valueOf(0) : null;
return b1 ? Integer.valueOf(0) : b2 ? 1 : null;

这看起来很尴尬,因为0和1的表示方式不同。您也可以显式地将1框起来:

return b1 ? Integer.valueOf(0) : b2 ? Integer.valueOf(1) : null;

这很有效,但是很冗长,一些好心的同事(或者你,当你几个月后回来时,忘记了显式装箱的原因)会删除装箱,因为你不需要它,对吗?

就我个人而言--最近花了一些时间详细研究了条件运算符--我会选择完全避免它,而不冒违反其奇怪的类型规则的风险。

if (b1) {
  return 0;
} else if (b2) {
  return 1;
} else {
  return null;
}
 类似资料:
  • 问题内容: 在我的应用程序中,我遇到了以下问题,并对结果感到惊讶: (两个整数)。 这是什么意思? 问题答案: 对于实际值,即结果为。 您使用整数除法得到的结果将向下舍入为的更负值。(也称为“地板部门”) 这就是为什么您会得到以下令人困惑的答案的原因: 注: 这是在Python 3中,其中的结果,“固定”是。因此,如果您没有理由使用Python 2,则应该升级。;) 在Python 3中,如果仍然

  • 谁能解释一下吗?

  • 问题内容: 我在timeit上获得了非常令人惊讶的结果,有人可以告诉我我做错了什么吗?我正在使用Python 2.7。 这是文件speedtest_init.py的内容: 这些是speedtest.py的内容: 控制台输出为: 我认为默认情况下timeit()运行代码的1000000倍,因此我需要将时间除以1000000,但是令人惊讶的是Counter的速度比defaultdict()慢。 那是预

  • 问题内容: 我试图弄清楚如何正确使用Java的执行器。我意识到向提交任务有其自身的开销。但是,我惊讶地发现它是如此之高。 我的程序需要以尽可能低的延迟处理大量数据(股市数据)。大多数计算是相当简单的算术运算。 我想测试的东西很简单:“ ” 最简单的测试在一个简单的循环中运行此计算。第二个测试在匿名Runnable内部执行相同的计算(这应该用来衡量创建新对象的成本)。第三次测试将传递给。(这用于衡量

  • 我有一个关于小数的整数的有趣问题。

  • 这是一个来自第三方库API的真实示例,但经过了简化。 用Oracle JDK 8U72编译 考虑以下两种方法: 两者都报告了一个“未经检查的强制转换”警告--我知道原因了。让我困惑的是为什么我可以打电话 试图传递会出现错误,正如所料: 如果报告为错误,为什么不是?