Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实例布尔变量的NullPointerException_Java - Fatal编程技术网

Java 实例布尔变量的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

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

}

您正在创建一个布尔数组,而不是布尔数组,并且在填充布尔对象之前尝试使用它,因此这将抛出一个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()
    ,因为它绕过了字符串池,并可能导致代码效率低下,不必要地创建额外的字符串对象

您正在创建一个布尔数组,不是布尔数组,并且在填充布尔对象之前尝试使用它,因此这将抛出一个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