什么是Java中的Null?

null在Java中是一个非常重要的概念,它最初是为了表示缺少某些东西,例如缺少用户、资源或任何东西而发明出来的。但是这也为Java程序员带来了很多麻烦,比如最常见的空指针异常(NullPointerException),下面我们将学习Java中null关键字的基本知识,并探讨一些技术以减少null检查,以及如何避免恶意的空指针异常。

1)首先,null是Java关键字,和public、static、final一样。它是区分大小写的,你不能将null写为NullNULL,编译器不会识别它们并会给出一个错误。

  1. Object obj = NULL ; // Not Ok
  2. Object obj1 = null // Ok

其他编程语言也有这个问题,但是现在大多数人都在使用IDE,这样的问题很容易避免,但是对于一些使用记事本、Vim或Emacs等程序来编写代码的程序员来说,这样的问题很常见,找出此类错误往往会浪费大量的时间。

2)就像每个基本类型一样,他们都有其默认值,例如 int 一般为0,boolean 有 false,null 是任何引用类型的默认值。就比如你创建了一个布尔变量,它的默认值是 false,Java 中的任何引用变量的默认值都为 null。这适用于所有类型的变量,例如成员变量或局部变量、实例变量或静态变量,但是如果你声明了一个局部变量但不初始化它,编译器会给出一个警告。为了验证这个事实,你可以创建一个变量来查看引用变量的值,并将其打印,如下面代码所示:

  1. private static Object myObj;
  2. public static void main(String args[]){
  3. System.out.println("What is value of myObjc : " + myObj);
  4. }

输出结果为:

  1. What is value of myObjc : null

对于静态和非静态来说结果都是一样的。

3)与创建的误解不同,null 既不是对象,也不是类型。它只是一个特殊的值,可以分配给任何引用类型,并且可以使用强制类型转换将任何类型转换为 null。如下所示:

  1. String str = null; // null可以赋值给String
  2. Integer itr = null; // 你也可以将null赋值给Integer
  3. Double dbl = null; // null也可以赋值给Double
  4. String myStr = (String) null; // 可以将null类型转换为String
  5. Integer myItr = (Integer) null; // 它也可以被转换为Integer
  6. Double myDbl = (Double) null; // 这也是可以的

在编译和运行时,你可以看到可以将null转换到任何引用类型,不想许多人想象的那样,这里并不会出现NullPointerException

4)null 只能赋给引用类型,不能将 null 赋给基本类型,例如 int、double、float 或 boolean。如果你这样做,编译器会给出一个错误,如下所示:

  1. int i = null; // type mismatch : cannot convert from null to int
  2. short s = null; // type mismatch : cannot convert from null to short
  3. byte b = null: // type mismatch : cannot convert from null to byte
  4. double d = null; //type mismatch : cannot convert from null to double
  5. Integer itr = null; // 这是可以的
  6. int j = itr; // 这也是可以的,但是在运行时会出现NullPointerException

正如你所看到的,如果你直接将 null 赋值给基本类型,编译器会给出类型不匹配的错误,但是你将 null 赋值给一个包装器对象,然后将该对象赋值给基本类型,这样可以通过编译器,但是在运行时会产生空指针异常的错误。这些都发生在Java的自动装箱中,我们在下面可以看到。

5)当Java将包装器还原到基本类型时,任何具有值 null 的包装器类都会抛出java.lang.NullPointerException。有些程序员错误的认为,自动装箱会负责将 null 转换为各自的基本类型的默认值,例如0为int,flase为boolean,但事实并不是这样。如下所示:

  1. Integer iAmNull = null;
  2. int i = iAmNull; // 记住:这里没有编译错误

但是当你运行上面的代码时,你将会看到线程"main"出现"java.lang.NullPointerException"异常。这在使用 HashMao 和 Integer key 值时经常发生。

7)如果对任何引用变量使用 null 或 null 文本本身,instanceof运算符都将返回 false。例如:

  1. Integer iAmNull = null;
  2. if(iAmNull instanceof Integer){
  3. System.out.println("iAmNull is instance of Integer");
  4. }else{
  5. System.out.println("iAmNull is NOT an instance of Integer");
  6. }

输出:

  1. iAmNull is NOT an instance of Integer

这是instanceof操作符的一个重要特性,它对类型转换检查非常有用。

7)你可能知道不能使用 null 值的引用变量调用非静态方法,它将抛出NullPointerException,但是你可能不知道,你可以使用 null 值的引用变量调用静态方法,由于静态方法使用静态绑定进行绑定,所以不会抛出"NullPointerException"。下面是一个例子:

  1. public class Testing {
  2. public static void main(String args[]){
  3. Testing myObject = null;
  4. myObject.iAmStaticMethod();// 正常输出
  5. myObject.iAmNonStaticMethod();//抛出NullPointerException
  6. }
  7. private static void iAmStaticMethod(){
  8. System.out.println("I am static method, can be called by null reference");
  9. }
  10. private void iAmNonStaticMethod(){
  11. System.out.println("I am NON static method, don't date to call me by null");
  12. }
  13. }

输出:

  1. I am static method, can be called by null reference
  2. Exception in thread "main" java.lang.NullPointerException
  3. at Testing.main(Testing.java:11)

8)你可以将 null 传递给方法,该方法接受任何引用类型,例如public void print(Object obj)可以被称为print(null),从编译器角度来看,这是可以的,但是行为完全依赖于该方法。在这种情况下,null 是安全的,不会抛出NullPointerException,它们只是正确的退出。如果业务逻辑允许,建议编写null安全方法。

9)可以使用"=="运算符和"!="运算符比较空值,但不能与其他算术或逻辑运算符(例如大于或小于)一起使用。与SQL不同,Java中的"null == null"将返回true。如下所示:

  1. public class Test {
  2. public static void main(String args[]) throws InterruptedException {
  3. String abc = null;
  4. String cde = null;
  5. if(abc == cde){
  6. System.out.println("null == null is true in Java");
  7. }
  8. if(null != null){
  9. System.out.println("null != null is false in Java");
  10. }
  11. // classical null check
  12. if(abc == null){
  13. // ...
  14. }
  15. // not ok, compile time error
  16. if(abc > null){
  17. }
  18. }
  19. }

输出:

  1. null == null is true in Java

总结:以上这些就是关于Java中null。通过Java编码的一些经验,使用简单的技巧来避免出现 NullPointerExcpetion,可以使得代码更加安全。由于 null 可以被视为空或者未初始化的值,因此它通常是混淆的来源。请记住,null 是任何引用变量的默认值,你不能用它调用任何实例方法,也不能在Java中使用 null 引用访问实例变量。

关于Java中的Null的更多相关文章

  1. Java中有关Null的9件事

    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常 (NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我 ...

  2. 转!!Java中关于Null的9个解释(Java Null详解)

    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...

  3. JAVA中String = null 与 String = "" 的区别

    JAVA中String = null 与 String = ""的区别 笔者今天在Debug的时候发现的NPE(NullPointerException),辛辛苦苦地调试了半天,终 ...

  4. Java中的Null是什么?

    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...

  5. Java中有关Null的9件事(转)

    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...

  6. java中,null值可以被强制转换为任何类型

    java中,null值可以被强制转换为任何类型

  7. 关于 Java 中的 Null

    什么是Java中的Null? null在Java中是一个非常重要的概念,它最初是为了表示缺少某些东西,例如缺少用户.资源或任何东西而发明出来的.但是这也为Java程序员带来了很多麻烦,比如最常见的空指 ...

  8. java中的null类型---有关null的9件事

    摘自 https://blog.csdn.net/qq_25077777/article/details/80174763 今天听到一个问题,java中的null类型,null竟然是一种类型 java ...

  9. Java中的null值总结

    自我总结,有什么不对或不到位的地方,请指出,感激不尽! 目的:熟练掌握java中null值出现的情况,避免NullPointerException 代码环境准备:需要引入junit;将代码packag ...

随机推荐

  1. android中include标签使用详解

    android中include标签是为了便于控件的覆用的一个很好解决方案.   但是也有一些需要注意的地方,下面是本人在项目中碰到过的一个问题,做此记录,便于以后查看.   include标签用法. ...

  2. web服务器学习1---httpd-2.4.29源码手动编译安装

    环境准备: 系统:CentOS 7.4 软件:httpd-2.4.29 一  Apache主要特点 apache服务器在功能,性能和安全性等方面表现比较突出,可以较好地满足web服务器地应用需求.主要 ...

  3. 【RabbitMQ系列】队列、绑定、交换器

    队列: 从概念上来讲,AMQP消息路由必须有三部分:交换器.队列和绑定.生产者把消息发布到交换器上:消息最终到达队列,并被消费者接收:绑定决定了消息如何从路由器路由到特定的队列. 消费者通过以下两种方 ...

  4. Beta版本展示博客

    1 团队介绍 团队组成: 齐爽爽(258)个人博客:http://www.cnblogs.com/shuangshuangblog/ 马帅(248)个人博客:http://www.cnblogs.co ...

  5. beta冲刺计划安排

    经过紧张的Alpha阶段,很多组已经从完全不熟悉语言和环境,到现在能够实现初步的功能.下一阶段即将加快编码进度,完成系统功能.强化软件工程的体会. 凡事预则立,在Beta开始前,以小组为单位,在敏捷冲 ...

  6. Java课程设计报告——购物车

    1.码云GIT提交 Git地址 2基本框架 3.基本界面 1.主界面: 2.购物车界面: 3.添加商品界面: 4.删除商品界面: 5.修改商品界面: 6.商城界面: 7.购物车显示界面: 4.代码解释 ...

  7. C++布隆过滤器

    布隆过滤器 这名词有没有听着好像很 挺高大上的,的确,它也是一种很重要的结构,下面一起看看: 一:说说历史: (Bloom Filter)是由布隆(Burton Howard Bloom)在1970年 ...

  8. 在Windows上安装「算法 第四版」组件

    这篇文档将向你介绍如何在Windows系统上安装本书将用到的Java开发环境,同时我们也提供了一个手把手的.使用我们提供的DrJava工具或者用命令行来创建.编译和运行你的第一个Java程序的手册,这 ...

  9. vue 中获取select 的option的value 直接click?

    我刚开始遇到这个问题的时候 直接用的click进行dom操作获取value 但是发现并灭有什么作用 问了旁边大神 才想起来还有change这个操作 于是乎 答案有了解决方案 1.在你的select中添 ...

  10. django报错invalid literal for int() with base 10: ''

    这种错误是因为模型类中某个字段的条件约束为int类型,但是给了一个字符串类型,所以报错,找到那个模型类的字段,并对应修改就好了.