首页 > 编程笔记 > Java笔记 阅读:8

Java null关键字的用法(非常详细,附带实例)

在 Java 开发过程中,经常会看到 null 关键字,它是一个比较复杂的关键字,经常会导致程序出问题。

可以用一句话来描述 null,就是:“null 表示某个变量没有引用任何东西(对象)。”通常我们说 null 为“空”。

Java null的作用

我们知道,Java 的数据类型可以分为基本数据类型和引用数据类型,也就是说在 Java 中定义的变量都属于这两种类型,它们都有各自的默认值:
因此,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

可以通过 if(str1 == null) 来判断 str1 是否为空。而 if(str1 == str2) 则判断两者是否相等,由于两者都为 null,因此结果为 true。

注意被注释的两行代码,因为 str1 和 nt 不属于同种数据类型,所以不能直接进行比较,编译时会报错。

Java NullPointerException异常

Java 程序员经常会与 NullPointerException 这个异常打交道,看到名字就知道这个异常与 null 相关,出现这个异常的原因主要有以下 4 种:
例如:
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 导致的)。

相关文章