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>
目录
相关文章
|
存储 NoSQL 算法
Redis集群,集群的概念 三种主流分片方式1.哈希求余 一致性哈希算法:方案三:哈希槽分区算法问题一Redis集群是最多有16384个分片吗问题二:为什么是16384个,集群扩容:1.新的主节点
Redis集群,集群的概念 三种主流分片方式1.哈希求余 一致性哈希算法:方案三:哈希槽分区算法问题一Redis集群是最多有16384个分片吗问题二:为什么是16384个,集群扩容:1.新的主节点
|
3天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
269 116
|
18天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
12天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
661 220
|
5天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
334 34
Meta SAM3开源:让图像分割,听懂你的话
|
10天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1534 157
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
897 61