我使用下面的代码检查初始化的布尔变量是否设置为True或False。 当我尝试运行此代码时,我收到NullPointerException错误。
有人可以解释会出现什么问题吗?
public class Scratch {
Boolean[] bool = new Boolean[5];
String s = new String();
public static void main(String[] args) {
new Scratch().mymethod();
}
public void mymethod() {
if (s == "Tom"){
System.out.println("Tom");
}
System.out.println("S value = "+ s);
if (bool[1] == true) {
System.out.println("True");
} else {
System.out.println("false");
}
}
}
答案 0 :(得分:9)
你正在创建一个布尔值,不是布尔值的数组,并且在使用布尔对象填充它之前尝试使用它,所以毫不奇怪这会抛出一个NPE。
解决方案:
Boolean[] bool = new Boolean[5];
到
boolean[] bool = new boolean[5];
或
Boolean[] bool = {Boolean.FALSE, Boolean.FALSE, Boolean.FALSE,
Boolean.FALSE, Boolean.FALSE};
修改
请理解boolean是一种原始类型,如果没有显式初始化布尔变量,则没有赋值,它默认为false。
另一方面,布尔值是一个“盒子”布尔值的引用类型,它提供了一个引用变量,可以在需要引用的布尔基元的位置使用,例如在集合中。对于所有引用类型都是如此的布尔变量,如果未明确分配给实例,则默认为空值。
修改2
请注意,如果您使用字符串,则会遇到同样的问题。例如
String unAssigned;
if (unAssigned.equals("foo") {
System.out.println("the method above throws a NPE");
}
或
String[] strings = new String[5];
// all the strings items above are null
编辑3
你想知道为什么这不会做同样的事情:String s = new String();
s
变量,因此 s不为空。new String()
,因为它绕过了字符串池,并且可能导致代码效率低下而不必要地创建额外的String对象。答案 1 :(得分:2)
这个“问题”是因为拳击关于Java中的原语..
Boolean
与boolean
不同,例如Integer
和int
......
Boolean
是对象(换行类),因此它具有true,false值,但它也具有 NULL 值。
虽然boolean
是原始变量,但它只有“真实”布尔值:true和false
Linke在指南中解释: 布尔类在对象中包装基本类型boolean的值。 Boolean类型的对象包含一个类型为boolean的字段。
所以Boolean b
,有3个值:true
,false
和null
。
boolean b
,有2个值:true
和false
null
值可以分配给任何变量,但基本类型的变量除外。并且布尔变量“初始化”为空值,因为你还没有调用布尔类的构造函数......
因此,如果您执行:String s = "HELLO"
,则可以使用它,因为使用tis代码,您可以自动调用String的构造函数。但是,如果你这样做:String s;
,其值为null
。布尔包装类的samt事。
澄清一下,您可以阅读:Creating Objects