您的位置:首页 > 编程语言 > Java开发

Java null

2022-02-16 17:51 441 查看

[TOC]


引言

对于 Java 程序员来说,空指针一直是恼人的问题,我们在开发中经常会受到 NullPointerException 的蹂躏和壁咚。Java 的发明者也承认这是一个巨大的设计错误。

那么关于 null,我们应该知道下面这几件事情来有效地了解 null,从而避免很多由 null 引起的错误。

  1. 大小写敏感

  2. null 是任何引用类型的初始值

  3. null 既不是对象也不是类型,它是一种特殊的值,你可以将它赋值给任何引用类型

  4. null 不能赋值给基本数据类型

  5. 将 null 赋给包装类,自动拆箱会报 NPE

  6. 带有 null 的引用类型变量,instanceof 会报 false

  7. 静态变量为 null 时,调用静态方法不会抛出 NPE

  8. 使用 null 值安全的方法

  9. 使用 == 或 != 判断 null


大小写敏感

首先,null 是 Java 中的关键字,像是 public、static、final 等。它是大小写敏感的,你不能将 null 写成 Null 或 NULL,这样编辑器将不能识别它们然后报错。

不过这个问题已经几乎不会出现,因为 eclipse 和 Idea 已经给出了编辑器提示。


null 是任何引用类型的初始值

null 是所有引用类型的默认值,Java 中的任何引用变量都将 null 作为默认值,也就是说所有 Object 类下的引用类型默认值都是 null。这对所有的引用变量都适用。

就像是基本类型的默认值一样,例如 int 的默认值是 0,boolean 的默认值是 false 。


null 只是一种特殊的值

null 既不是对象也不是类型,它是一种特殊的值,你可以将它赋值给任何引用类型。

public static void main(String[] args){
String str = null;
Integer itr = null;
Double dou = null;

Integer integer = (Integer) null;
String string = (String) null;

Systemout.printlnC"integer=" + integer);
System.out.printlnc"string=" + string);
}

你可以看到在编译期和运行期内,将 null 转换成任何的引用类型都是可行的,并且不会抛出空指针异常。

null 只能赋值给引用变量,不能赋值给基本类型变量

持有 null 的包装类在进行自动拆箱的时候,不能完成转换,会抛出空指针异常,并且 null 也不能和基本数据类型进行对比:

public static void main(String[] args){
int i = 0;
Integer itr = null;
System.out.println(itr == i);
}

**使用了带有 null 值的引用类型变量,instanceof 操作会返回 false 😗*

public static void main(String[] args){

Integer isNull = null;
// instanceof = isInstance 方法
if(isNull instanceof Integer){
System.out.println("isNull is instanceof Integer");
}else{
System.out.println("isNull is not instanceof Integer");
}
}

这是 instanceof 操作符一个很重要的特性,使得对类型强制转换检查很有用。

静态变量为 null 时,调用静态方法不会抛出 NullPointerException,因为静态方法使用了静态绑定。


使用 Null-Safe 方法

你应该使用 null-safe 安全的方法,java 类库中有很多工具类都提供了静态方法,例如基本数据类型的包装类如 Integer,Double 等。

public class NullSafeMethod {

private static String number;

public static void maincstring args){
String s = String.valueOf(number);
String string = number.toString();
System.out.println("s=" + s);
System.out.println("string=" + string);
}
}

number 没有赋值,所以默认为 null,使用 String.value(number) 静态方法没有抛出空指针异常,但是使用 toString() 却抛出了空指针异常。所以尽量使用对象的静态方法


null 判断

你可以使用 == 或者 != 操作来比较 null 值,但是不能使用其他算法或者逻辑操作,例如小于或者大于。

跟 SQL 不一样,在 Java 中 null ==null 将返回 true,如下所示:

public class CompareNull {

private static string str1;
private static string str2;

public static void main(String[] args){
System.out.println("str1 == str2?" + str1==str2);
System.out.println(null == null);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: