Java null关键字的用法(非常详细,附带实例)
在 Java 开发过程中,经常会看到 null 关键字,它是一个比较复杂的关键字,经常会导致程序出问题。
可以用一句话来描述 null,就是:“null 表示某个变量没有引用任何东西(对象)。”通常我们说 null 为“空”。
因此,null 关键字的主要作用有两点,一是作为引用数据类型的默认值,二是变量不再使用时可设为不可用,如下图所示。

图 1 null的作用
Java 中定义的所有对象都属于引用数据类型,它们的默认值都为 null,例如:
当不再使用某个对象变量时,可以将其设置为 null,使得变量不可用,同时也有利于垃圾回收器更好地回收对象。例如:
注意被注释的两行代码,因为 str1 和 nt 不属于同种数据类型,所以不能直接进行比较,编译时会报错。
例如:
可以用一句话来描述 null,就是:“null 表示某个变量没有引用任何东西(对象)。”通常我们说 null 为“空”。
Java null的作用
我们知道,Java 的数据类型可以分为基本数据类型和引用数据类型,也就是说在 Java 中定义的变量都属于这两种类型,它们都有各自的默认值:- 如果变量是基本数据类型,其默认值为各自对应的类型,比如 int 类型的默认值为 0,而 boolean 类型的默认值为 false。
- 引用数据类型也有默认值,Java 统一规定所有引用数据类型变量的默认值都为 null,比如 String 类型的变量默认为 null,数组变量的默认值也为 null。此外,当一个引用数据类型的变量不再被使用时可以设置为 null,表示该变量不可用,此时它不引用任何对象。
因此,null 关键字的主要作用有两点,一是作为引用数据类型的默认值,二是变量不再使用时可设为不可用,如下图所示。

图 1 null的作用
Java 中定义的所有对象都属于引用数据类型,它们的默认值都为 null,例如:
public class NullTest { private static String str; private static NullTest nt; public static void main(String[] args) { System.out.println("default value:" + str); System.out.println("default value:" + nt); } }对于变量 str 和变量 nt,如果我们没有对它们进行显式赋值,则它们的默认值都为 null,程序将输出两行“default value:null”。
当不再使用某个对象变量时,可以将其设置为 null,使得变量不可用,同时也有利于垃圾回收器更好地回收对象。例如:
public class NullTest2 { private static String str = "test"; public static void main(String[] args) { System.out.println(str.length()); str = null; System.out.println(str.length()); } }程序中定义了一个字符串对象变量 str 并赋值为“test”,此时我们可以使用它。然而当我们将 str 赋值为 null 后则该变量不可用,如果再使用它则会报错“NullPointerException”。
null的实际应用
null 是一种特殊的值,编程过程中可以用 == 运算符来判断变量是否为 null。例如:public class NullTest3 { public static String str1 = null; public static String str2 = null; public static NullTest3 nt = null; public static void main(String[] args) { if (str1 == null) System.out.println("str1 is null"); if (str1 == str2) System.out.println("str1==str2 is true"); System.out.println(null == null); //if (str1 == nt) // System.out.println("str1==str2 is true"); } }运行结果为:
str1 is true
str1==str2 is true
true
注意被注释的两行代码,因为 str1 和 nt 不属于同种数据类型,所以不能直接进行比较,编译时会报错。
Java NullPointerException异常
Java 程序员经常会与 NullPointerException 这个异常打交道,看到名字就知道这个异常与 null 相关,出现这个异常的原因主要有以下 4 种:- 当一个对象变量为 null 时调用该对象的方法;
- 运行时访问一个值为 null 的对象;
- 数组为 null 时根据索引访问数组的元素;
- 数组为 null 时获取数组的长度。
例如:
public class NullTest4 { int a; int[] b; void test() { System.out.println("test"); } public static void main(String[] args) { NullTest4 nt = null; nt.test(); // NullPointerException异常 System.out.println(nt.a); // NullPointerException异常 nt = new NullTest4(); int value = nt.b[0]; // NullPointerException异常 int length = nt.b.length; // NullPointerException异常 } }程序中展示了以上 4 种导致 NullPointerException 异常的情况,大家可以根据代码去理解每种情况(总结起来都是由 null 导致的)。