什么是Java中的Null?

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

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

Object obj =  NULL ; // Not Ok
Object obj1 = null // Ok

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

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

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

输出结果为:

What is value of myObjc : null

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

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

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

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

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

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

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

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

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

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

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

Integer iAmNull = null;
if(iAmNull instanceof Integer){
System.out.println("iAmNull is instance of Integer");
}else{
System.out.println("iAmNull is NOT an instance of Integer");
}

输出:

iAmNull is NOT an instance of Integer

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

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

public class Testing {
public static void main(String args[]){
Testing myObject = null;
myObject.iAmStaticMethod();// 正常输出
myObject.iAmNonStaticMethod();//抛出NullPointerException
} private static void iAmStaticMethod(){
System.out.println("I am static method, can be called by null reference");
} private void iAmNonStaticMethod(){
System.out.println("I am NON static method, don't date to call me by null");
} }

输出:

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

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

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

public class Test {

    public static void main(String args[]) throws InterruptedException {

       String abc = null;
String cde = null; if(abc == cde){
System.out.println("null == null is true in Java");
} if(null != null){
System.out.println("null != null is false in Java");
} // classical null check
if(abc == null){
// ...
} // not ok, compile time error
if(abc > null){ }
}
}

输出:

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. Java实现单向链表基本功能

    一.前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了.数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用- 本文主要讲解单链表的基础知识点,做一个简单 ...

  2. Android游戏开发之旅 View类详解

    Android游戏开发之旅 View类详解 自定义 View的常用方法: onFinishInflate() 当View中所有的子控件 均被映射成xml后触发 onMeasure(int, int) ...

  3. Redis——常见面试题

    一.memcached与redis的区别? 1.存储方式不同.memcached把数据全部存在内存之中,断电之后会挂掉,而redis虽然也用到了内存,但是会有部分数据存在硬盘中,保证数据持久性. 2. ...

  4. winform 适配high dpi

    在 mainifest文件中添加:(新建mainifest文件的时候以下内容是有的,只要取消注释就可以了) <compatibility xmlns="urn:schemas-micr ...

  5. Archlinux无线联网教程

    本人是学生党,故对于有线方式不甚了解,学校里一般使用mentohust用动态IP方式联网,或者直接连接wifi,这里介绍无线联网的一些方式,主要包括公共wifi和带有WEP或者WPA或者WPA2PSK ...

  6. Solr搜索引擎搭建详细过程

    1    什么是solr Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr可以独立运行在Jetty.Tomcat等这些Servlet容器中 ...

  7. rcnn fast-rcnn faster-rcnn资料

    ---恢复内容开始--- 框架:https://github.com/rbgirshick 论文:链接: https://pan.baidu.com/s/1jIoChxG 密码: ubgm faste ...

  8. xxe漏洞检测及代码执行过程

    这两天看了xxe漏洞,写一下自己的理解,xxe漏洞主要针对webservice危险的引用的外部实体并且未对外部实体进行敏感字符的过滤,从而可以造成命令执行,目録遍历等.首先存在漏洞的web服务一定是存 ...

  9. php里面的变量的使用

    php里面的变量一般可以直接使用不需要声明,但是这种var_dump($a);就会报错,还有sql语句里面如果某个变量为空也会报错. 如果变量为null,空,未声明都==false,但是不===fal ...

  10. io文本加密

    文本加密习题 package io; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Inpu ...