一.关于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。
同理我们也可以声明一个引用变量,并将其赋值为默认值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)
三.关于未初始化
方法中的基本变量和引用变量,如果只是声明而未初始化的话,在编译时会报错;这样反而有一个好处就是避免在运行时才出现错误。因此这种声明方式要比下面这种好。
注意:如果是类的成员变量,在创建类的时候,所有成员变量会被赋予默认值。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);
}
}
}
结果
(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,在对数组进行遍历前应该先进行判断,避免出错。