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);
}
}
            </div>
目录
相关文章
|
12月前
|
存储 关系型数据库 MySQL
10个案例告诉你mysql不使用子查询的原因
大家好,我是V哥。上周与朋友讨论数据库子查询问题,深受启发。为此,我整理了10个案例,详细说明如何通过优化子查询提升MySQL性能。主要问题包括性能瓶颈、索引失效、查询优化器复杂度及数据传输开销等。解决方案涵盖使用EXISTS、JOIN、IN操作符、窗口函数、临时表及索引优化等。希望通过这些案例,帮助大家在实际开发中选择更高效的查询方式,提升系统性能。关注V哥,一起探讨技术,欢迎点赞支持!
569 5
|
安全 数据管理 关系型数据库
解锁数据管理的无限可能——探索 Teable 多维表格
Teable 是一个基于 Postgres 构建的企业级多维表格解决方案,提供卓越性能、灵活多维表格、丰富视图、精细权限管理、实时协作及自动化工作流等核心特性,支持私有部署,助力企业高效管理海量数据,加速数字化转型。
1043 3
|
存储 弹性计算 固态存储
2023阿里云服务器租用价格表(优惠报价和官方收费标准)
阿里云服务器租用价格表包括ECS共享型s6、通用算力型u1、计算型c6、计算型c7、通用型g6、通用型g7及GPU云服务器等,包括云服务器ECS实例CPU内存价格、公网带宽价格和系统盘收费标准
2754 0
2023阿里云服务器租用价格表(优惠报价和官方收费标准)
|
Java
如何获取第三方应用授权app_auth_token
一,说明    1.第三方应用文档:[url]https://docs.open.alipay.com/20160728150111277227/intro[/url]     2.作用:代替商户发起相关逻辑请求 二,配置    1.
5791 12
|
搜索推荐
如何搜索到阿里云盘分享资源
云盘资源,浩如烟海,但缺乏搜索工具,让无数网友苦不堪言。幸运的是,现在有了强大的网盘搜索引擎,一切问题迎刃而解。轻松找到您需要的文件,快速下载,节省时间。享受便捷的云盘体验,释放您的创造力。无论是工作文档还是娱乐资源,网盘搜索引擎助您轻松搞定。解放您的搜索困扰,开启全新的云盘世界!
5868 1
|
网络协议 网络安全
关于wireguard异地组网
关于wireguard异地组网
1202 0
|
JSON 数据格式 Kotlin
Kotlin | Flow数据流的几种使用场景
Flow数据流的几种使用场景及其注意事项
685 0
|
XML 存储 JSON
使用 Plist 编辑器——简单入门指南
本指南将介绍如何使用 Plist 编辑器。您将学习如何打开、编辑和保存 plist 文件,并了解 plist 文件的基本结构和用途。跟随这个简单的入门指南,您将掌握如何使用 Plist 编辑器轻松管理您的 plist 文件。
|
文字识别 开发工具 Python
Python编程:通过百度文字识别提取表格数据
Python编程:通过百度文字识别提取表格数据
268 0
Python编程:通过百度文字识别提取表格数据
|
SQL 缓存 Java
Ruoyi集成flyway后启动报错的解决方法
本文简单介绍了ruoyi系统以及flyway数据库版本控制技术。并说明了如何在ruiyi中集成flyway组件。重点阐述了集成flyway的过程中会遇到的问题以及针对这个问题的三种不同的解决方案。
1012 0
Ruoyi集成flyway后启动报错的解决方法