Java 将布尔对象与布尔基元进行比较
这段代码的输出是什么?请解释自动装箱或取消装箱id是如何在此处完成的Java 将布尔对象与布尔基元进行比较,java,boolean,Java,Boolean,这段代码的输出是什么?请解释自动装箱或取消装箱id是如何在此处完成的 class MyBoolean { Boolean[] bool = new Boolean[5]; public static void main(String[] args) { new MyBoolean().myMethod(); } public void myMethod() { if(bool[1]==true) {
class MyBoolean
{
Boolean[] bool = new Boolean[5];
public static void main(String[] args)
{
new MyBoolean().myMethod();
}
public void myMethod()
{
if(bool[1]==true)
{
System.out.println("It's true");
}
else
{
System.out.println("It's false");
}
}
}
运行失败:bool[1]为null,比较抛出NullPointerException。代码失败,出现
NullPointerException
,因为bool[1]
包含null
。根据,通过调用Boolean
引用来取消装箱Boolean
。因为在这种情况下,引用是null
,所以您会得到一个NPE
在对另一个答案的评论中,您写道:
问这个问题的原因是为了了解我们是通过自动拆箱还是通过自动装箱获得NPE。据我所知,这是由于自动装箱
这是由于取消装箱(从引用类型提取原语),而不是装箱(在引用类型中包装primative)。具体来说,从(布尔等式运算符=
和!=
):
如果其中一个操作数的类型为布尔
,则将对其进行解装箱转换(§5.1.8)
为什么不运行它并找出答案呢?我需要知道在这个比较中内部发生了什么:我是认真的;运行它,您将得到您的答案。-1:“==”运算符不能导致NullPointerException。但是Java尝试将bool[1]转换为布尔对象以评估比较。您得到了一个NullPointerException。@dash1e:“但是Java尝试将布尔[1]转换为布尔对象”否,运行时尝试将
bool[1]
中的Boolean
转换为Boolean
原语(小写)。正是这种转换导致了NPE,因为在bool[1]
中根本没有Boolean
。投票人:他关于导致NPE的说法是对的。你是对的,它已经是一个布尔值了,Java尝试用布尔值进行转换,当我看到投票结果时,我很快写道。