NullPointerException,例如boolean变量

时间:2014-02-16 20:06:46

标签: java

我使用下面的代码检查初始化的布尔变量是否设置为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");
        }
    }

}

2 个答案:

答案 0 :(得分:9)

你正在创建一个布尔值,不是布尔值的数组,并且在使用布尔对象填充它之前尝试使用它,所以毫不奇怪这会抛出一个NPE。

解决方案:

  • 创建一个boolean数组,如果已初始化,则将填充默认的false值。
  • 如果必须,创建一个Boolean数组(例如,如果在JTable模型中使用),但在使用数组之前,请确保将每个项初始化为有效的Boolean实例。
例如,从

改变
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();

  • 您正在创建一个新的String对象并将其分配给s变量,因此 s不为空
  • 使用布尔数组,是的,您正在为变量分配一个新数组,因此数组不为空,但数组保存的项目为空。
  • 你没有在任何地方使用String数组,所以它不在同一个地方。来吧,让我们比较苹果和苹果,而不是苹果和橙子。
  • 顺便说一下,你几乎不应该使用new String(),因为它绕过了字符串池,并且可能导致代码效率低下而不必要地创建额外的String对象。

答案 1 :(得分:2)

这个“问题”是因为拳击关于Java中的原语..

Booleanboolean不同,例如Integerint ......

Boolean对象(换行类),因此它具有true,false值,但它也具有 NULL 值。 虽然boolean原始变量,但它只有“真实”布尔值:true和false

Linke在指南中解释: 布尔类在对象中包装基本类型boolean的值。 Boolean类型的对象包含一个类型为boolean的字段。

所以Boolean b有3个值truefalsenull

boolean b有2个值truefalse

null值可以分配给任何变量,但基本类型的变量除外。并且布尔变量“初始化”为空值,因为你还没有调用布尔类的构造函数......

因此,如果您执行:String s = "HELLO",则可以使用它,因为使用tis代码,您可以自动调用String的构造函数。但是,如果你这样做:String s;,其值为null。布尔包装类的samt事。

澄清一下,您可以阅读:Creating Objects