Java 实例布尔变量的NullPointerException
我使用下面的代码检查初始化的布尔变量是否设置为True或False。 当我试图运行这段代码时,我得到一个NullPointerException错误 有人能解释一下问题出在哪里吗Java 实例布尔变量的NullPointerException,java,Java,我使用下面的代码检查初始化的布尔变量是否设置为True或False。 当我试图运行这段代码时,我得到一个NullPointerException错误 有人能解释一下问题出在哪里吗 public class Scratch { Boolean[] bool = new Boolean[5]; String s = new String(); public static void main(String[] args) { new Scratch().my
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");
}
}
}
您正在创建一个布尔数组,而不是布尔数组,并且在填充布尔对象之前尝试使用它,因此这将抛出一个NPE也就不足为奇了 解决方案:
- 创建一个布尔值数组,如果初始化,它将填充默认的假值
- 如果必须创建一个布尔值数组(例如在JTable模型中使用),但在使用该数组之前,请确保每个项都已初始化为有效的布尔值实例
Boolean[] bool = new Boolean[5];
到
或
编辑 请理解布尔是一种基本类型,如果布尔变量没有显式初始化,没有赋值,则默认为false 另一方面,Boolean是一种引用类型,它“装箱”一个Boolean,提供一个引用变量,该变量可用于需要引用的Boolean基元的位置,例如在集合中。与所有引用类型一样,布尔变量如果未显式分配给实例,则默认为空值
编辑2 请注意,如果使用字符串,将遇到相同的问题。比如说
String unAssigned;
if (unAssigned.equals("foo") {
System.out.println("the method above throws a NPE");
}
或
编辑3 您想知道为什么这样做不一样:
String s=new String()代码>
- 您正在创建一个新的字符串对象并将其分配给
s
变量,因此s不为空
- 对于布尔数组,是的,您正在为变量分配一个新数组,因此数组不是空的,但数组所包含的项是空的
- 您在任何地方都没有使用字符串数组,因此它与同一事物没有任何相似之处。来吧,让我们把苹果和苹果比较,而不是苹果和桔子比较
- 顺便说一句,您几乎不应该使用
newstring()
,因为它绕过了字符串池,并可能导致代码效率低下,不必要地创建额外的字符串对象
您正在创建一个布尔数组,不是布尔数组,并且在填充布尔对象之前尝试使用它,因此这将抛出一个NPE也就不足为奇了
解决方案:
- 创建一个布尔值数组,如果初始化,它将填充默认的假值
- 如果必须创建一个布尔值数组(例如在JTable模型中使用),但在使用该数组之前,请确保每个项都已初始化为有效的布尔值实例
e、 例如,从
Boolean[] bool = new Boolean[5];
到
或
编辑
请理解布尔是一种基本类型,如果布尔变量没有显式初始化,没有赋值,则默认为false
另一方面,Boolean是一种引用类型,它“装箱”一个Boolean,提供一个引用变量,该变量可用于需要引用的Boolean基元的位置,例如在集合中。与所有引用类型一样,布尔变量如果未显式分配给实例,则默认为空值
编辑2
请注意,如果使用字符串,将遇到相同的问题。比如说
String unAssigned;
if (unAssigned.equals("foo") {
System.out.println("the method above throws a NPE");
}
或
编辑3
您想知道为什么这样做不一样:String s=new String()代码>
- 您正在创建一个新的字符串对象并将其分配给
s
变量,因此s不为空
- 对于布尔数组,是的,您正在为变量分配一个新数组,因此数组不是空的,但数组所包含的项是空的
- 您在任何地方都没有使用字符串数组,因此它与同一事物没有任何相似之处。来吧,让我们把苹果和苹果比较,而不是苹果和桔子比较
- 顺便说一句,您几乎不应该使用
newstring()
,因为它绕过了字符串池,并可能导致代码效率低下,不必要地创建额外的字符串对象
这个“问题”是因为Java中关于原语的装箱
Boolean
与Boolean
不同,例如Integer
和int
Boolean
是一个对象(wrap类),因此它有true和false值,但也有NULL值。
虽然布尔值
是一个基元变量,因此它只有“实”布尔值:true和false
链接在指南中解释:Boolean类在对象中包装一个基本类型Boolean的值。布尔类型的对象包含一个布尔类型的字段。
因此,Boolean b
,有3个值:true
,false
和null
boolean b
,有2个值:true
和false
null
值可以分配给任何变量,基本类型的变量除外。布尔变量“初始化”为空值,因为您还没有调用布尔类的构造函数
因此,如果您这样做:String s=“HELLO”
,您可以使用它,因为在这段代码中,您会自动调用String的构造函数。但如果您这样做:strings
其值为null
。布尔包装类的samt
为了澄清这一点,您可以阅读以下内容:这个“问题”是因为Java中关于原语的装箱
Boolean
与Boolean
不同,例如Integer
和int
Boolean
是一个对象
String[] strings = new String[5];
// all the strings items above are null