空值 null


#Java 笔记


null 是空的意思,是对象的一个特殊值,代表没有值。

对象若要值为 null,需要显式赋值

要一个对象的值是 null, 需要显式复制, 否则会编译报错.

比如:

// 会报错
public class NullTest {
    public static void main(String[] args) {
        String s;
        System.out.println(s);
    }
}

报错如下:

错误: 可能尚未初始化变量s
        System.out.println(s);
                           ^

下面的代码是正确的:

public class NullTest {
    public static void main(String[] args) {
        String s = null;
        System.out.println(s);
    }
}

执行结果:

null

null 与 null 是相等的

public class NullTest {
    public static void main(String[] args) {
        String s = null;
        System.out.println(s == null);
        System.out.println(null == null);
        System.out.println(null != null);
    }
}

执行结果:

true
true
false

System.out.println 不能直接输出 null

因为找不到匹配的函数.

示例:

// 会报错
public class NullTest {
    public static void main(String[] args) {
        System.out.println(null);
    }
}

报错如下:

错误: 对println的引用不明确
        System.out.println(null);
                  ^
  PrintStream 中的方法 println(char[]) 和 PrintStream 中的方法 println(String) 都匹配

下面这个是没问题的:

public class NullTest {
    public static void main(String[] args) {
        System.out.println(""+null);
    }
}

运行结果:

null

System.out.printf 不能直接输出 null

下面的示例会报错:

// 会报错
public class NullTest {
    public static void main(String[] args) {
        System.out.printf("%s", null);
    }
}

报错如下:

 警告: 最后一个参数使用了不准确的变量类型的 varargs 方法的非 varargs 调用; 
        System.out.printf("%s", null);
                                ^
  对于 varargs 调用, 应使用 Object
  对于非 varargs 调用, 应使用 Object[], 这样也可以抑制此警告
1 个警告

下面的示例也会报错:

// 会报错
public class NullTest {
    public static void main(String[] args) {
        System.out.printf(null);
    }
}

报错如下:

Exception in thread "main" java.lang.NullPointerException

null 可以参与字符串拼接

示例1:

public class NullTest {
    public static void main(String[] args) {
        String s = null;
        System.out.println(s + "拼接" + null);
    }
}

执行结果:

null拼接null

示例2:

public class NullTest {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        String s = null;
        sb.append(s);
        // sb.append(null);  // 这种写法会报错, 因为匹配不到函数
        System.out.println(sb.toString());
    }
}

执行结果:

null

null instanceof 的结果为 false

示例1:

public class NullTest {
    public static void main(String[] args) {
        System.out.println(null instanceof String);
    }
}

执行结果:

false

示例2:

public class NullTest {
    public static void main(String[] args) {
        String s = null;
        System.out.println(s instanceof String);
    }
}

执行结果:

false

instanceof null 无法编译通过

示例:

// 会报错
public class NullTest {
    public static void main(String[] args) {
        String s = "a";
        System.out.println(s instanceof null);
    }
}

报错如下:

错误: 非法的类型开始
        System.out.println(s instanceof null);
                                        ^


( 本文完 )