Java 中关于 Null 的这些事儿你知道吗

简介: 对于 Java 程序员来说,null 一直是令人头疼的问题,经常会受到 NullPointerException 的蹂躏和壁咚。Java 的发明者也承认这是一个巨大的设计错误。

对于 Java 程序员来说,null 一直是令人头疼的问题,经常会受到 NullPointerException 的蹂躏和壁咚。Java 的发明者也承认这是一个巨大的设计错误。

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

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

333.png


这个问题已经几乎不会出现,因为eclipse 和 Idea编译器已经给出了编译器提示,所以你不用考虑这个问题。

  1. 就像是基本类型的默认值一样,例如 int 的默认值是 0,boolean 的默认值是 false,null 是所有引用类型的默认值,Java中的任何引用变量都将null作为默认值,也就是说所有 Object 类下的引用类型默认值都是 null。这对所有的引用变量都适用。
publicclass DefaultNullValue {
    privatestatic Object value;
    public static void printValue(){
        System.out.println("value = " + value);
    }
    public static void main(String[] args) {
        printValue();
    }
}

这对静态和非静态的object来说都是正确的。就像你在这里看到的这样,我将 value 定义为静态引用,还有一个静态方法,我可以在 main 函数中直接使用它。

  1. 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;
  System.out.println("integer = " + integer);
  System.out.println("string = " + string);
}

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

  1. null 只能赋值给引用变量,不能赋值给基本类型变量。
  2. 持有 null 的包装类在进行自动拆箱的时候,不能完成转换,会抛出空指针异常,并且 null 也不能和基本数据类型进行对比
public static void main(String[] args) {
  int i = 0;
  Integer itr = null;
  System.out.println(itr == i);
}
  1. 使用了带有 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 操作符一个很重要的特性,使得对类型强制转换检查很有用

  1. 静态变量为 null 调用静态方法不会抛出 NullPointerException。因为静态方法使用了静态绑定(更多动态绑定和静态绑定的了解,请参考下面这篇文章 理解静态绑定与动态绑定),例如:
publicclass ComplingBinding {
    public static void staticMehtod(){
        System.out.println("静态方法");
    }
    public void instanceMethod(){
        System.out.println("非静态方法");
    }
    public static void main(String[] args) {
        ComplingBinding binding = null;
        binding.staticMehtod();
        binding.instanceMethod();
    }
}
  1. 你应该使用 null-safe 安全的方法,java类库中有很多工具类都提供了静态方法,例如基本数据类型的包装类,Integer,Double 等。例如
publicclass NullSafeMethod {
    privatestatic String number;
    public static void main(String[] 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()却抛出了空指针异常。所以尽量使用对象的静态方法。

  1. 你可以使用 == 或者 != 操作来比较 null 值,但是不能使用其他算法或者逻辑操作,例如小于或者大于。跟SQL不一样,在Java中 null == null 将返回 true,如下所示:
publicclass CompareNull {
    privatestatic String str1;
    privatestatic String str2;
    public static void main(String[] args) {
        System.out.println("str1 == str2 ? " + str1 == str2);
        System.out.println(null == null);
    }
}
相关文章
|
4月前
|
Java 测试技术
Java系列之判断字符串是为空或者null
这篇文章介绍了如何在Java中使用`isEmpty()`方法判断字符串是否为空或`null`,并提供了相应的测试用例来演示其用法。
|
4月前
|
IDE Java 测试技术
如何优雅地根治Java中Null值引起的Bug问题
【8月更文挑战第18天】在Java开发中,null 值是一个既常见又危险的存在。它常常是导致程序崩溃、难以调试的“罪魁祸首”。然而,通过一系列优雅的策略和实践,我们可以有效地减少甚至根除由 null 值引发的Bug。本文将从多个方面探讨如何做到这一点。
87 4
|
4月前
|
存储 JavaScript Java
Java中未被初始化的字符串打印出“null”?
在Java中,未初始化的`String`变量默认值为`null`。打印此类变量时输出“null”,是因为`PrintStream`类中的`print`方法特别处理了`null`值,将其转换为字符串“null”。从JDK 17开始,`println`方法通过`String.valueOf`间接实现相同功能。当拼接包含`null`的字符串时,如`s1 + "BLACK"`,结果为“nullBLACK”,这是因为字符串构建过程中`StringBuilder`的`append`方法将`null`转换为“null”。
|
4月前
|
NoSQL Java Redis
【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
|
4月前
|
Java 程序员 开发者
Java之! = null判空
总之,`!= null`的判空技巧对于任何使用Java进行开发的程序员都是基本功,它有助于维护代码的清晰度和安全性,在编写可靠和维护性强的软件应用时扮演着关键角色。掌握这个简单却重要的技术,将对任何Java开发者的职业生涯大有裨益。
75 0
|
6月前
|
Java 数据处理 Apache
探讨Java中判断String类型为空和null的方法
探讨Java中判断String类型为空和null的方法
74 1
|
7月前
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
277 3
|
6月前
|
安全 算法 Java
Java8实战-用Optional取代null
Java8实战-用Optional取代null
33 0
|
6月前
|
Web App开发 分布式计算 大数据
MaxCompute操作报错合集之配置归并节点,出现java.lang.NullPointerException: null错误提示,该怎么办
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
6月前
|
Java
Java中判断String类型为空和null的方法
Java中判断`String`变量是否为空或`null`需用`== null`和`.isEmpty()`。示例代码提供两种方法:`main`方法直接判断,`safeGetString`方法提供默认值。当输入为`null`或空时,返回默认值。代码包含三个测试案例,分别处理`null`、空字符串和非空非`null`字符串。
124 0