一.关于null

Java中的变量分为两类,基本变量和引用变量。

如果是类的成员变量,在创建类的时候,所有成员变量会被赋予默认值。int的默认值是0,boolean的默认值是false,而所有引用变量的默认值则是null。
例子:

public class Main {
    public static void main(String[] args) {
        Test test = new Test();
        System.out.println(test.i);
        System.out.println(test.I);
    }
}

class Test{
    int i;
    Integer I;
}

//输出
0
null

原因:当Test test = new Test();的时候,会在堆中初始化对象,并将类变量一并初始化,赋予默认值。

所以System.out.println(test.I);取该对象的成员变量时会取到其默认值null。

java 数组 不等于空 java数组为null_java 数组 不等于空


同理我们也可以声明一个引用变量,并将其赋值为默认值null。

例子:

public class Main {
    public static void main(String[] args) {
        Integer I = null;
        System.out.println(I);
    }
}
//结果
null

二.关于空指针

原因:空指针大部分原因是,我们声明了一个引用变量,但是没有将该引用变量指向一个具体的对象(也就是如上图的没有将引用变量指向堆中的具体内存),因此当在调用该引用变量的成员变量或者方法时,会出现空指针。
例子:

public class Main {
    public static void main(String[] args) {
        Test test = null;//注意!!!
        System.out.println(test.i);
        System.out.println(test.I);

    }
}

class Test{
    int i;
    Integer I;
}
//结果
Exception in thread "main" java.lang.NullPointerException
	at com.company.Main.main(Main.java:14)

分析:Test test = null;声明了引用变量,但是没有指向堆中一个具体的对象,而是赋值为null,导致System.out.println(test.i);去堆中取test.i时,并没有指向i成员变量的指针,因此报错。

同理:

public class Main {
    public static void main(String[] args) {
        Integer integer = null;
        System.out.println(integer.toString());
    }
}
//结果
Exception in thread "main" java.lang.NullPointerException
	at com.company.Main.main(Main.java:14)

三.关于未初始化

java 数组 不等于空 java数组为null_java_02


方法中的基本变量和引用变量,如果只是声明而未初始化的话,在编译时会报错;这样反而有一个好处就是避免在运行时才出现错误。因此这种声明方式要比下面这种好。

java 数组 不等于空 java数组为null_java 数组 不等于空_03


注意:如果是类的成员变量,在创建类的时候,所有成员变量会被赋予默认值。int的默认值是0,boolean的默认值是false,而所有引用变量的默认值则是null。即在类在堆中初始化时,成员变量就已经初始化并赋默认值。

四.数组长度为0

(1)当数组长度为0时,对数组进行遍历不会出错
例子:

public class Main {
    public static void main(String[] args) {
        Integer[] integers = new Integer[0];
        for (Integer integer:integers) {
            System.out.println(integer);
        }
    }
}

结果

java 数组 不等于空 java数组为null_默认值_04


(2)当数组为null时,对数组进行遍历会出错,其实就是取数组长度也会出错,错误原理与第二点空指针一样

public class Main {
    public static void main(String[] args) {
        Integer[] integers = null;
        for (Integer integer:integers) {
            System.out.println(integer);
        }
    }
}
//结果
Exception in thread "main" java.lang.NullPointerException
	at com.company.Main.main(Main.java:14)

结论:
1.尽量少用null赋值为引用变量,避免后面调用出现空指针错误。
2.如果不确定数组是否为null,在对数组进行遍历前应该先进行判断,避免出错。