关于Java中的Null
什么是Java中的Null?
null
在Java中是一个非常重要的概念,它最初是为了表示缺少某些东西,例如缺少用户、资源或任何东西而发明出来的。但是这也为Java程序员带来了很多麻烦,比如最常见的空指针异常(NullPointerException
),下面我们将学习Java中null关键字的基本知识,并探讨一些技术以减少null检查,以及如何避免恶意的空指针异常。
1)首先,null
是Java关键字,和public、static、final一样。它是区分大小写的,你不能将null
写为Null
或NULL
,编译器不会识别它们并会给出一个错误。
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的更多相关文章
- Java中有关Null的9件事
对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常 (NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我 ...
- 转!!Java中关于Null的9个解释(Java Null详解)
对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...
- JAVA中String = null 与 String = "" 的区别
JAVA中String = null 与 String = ""的区别 笔者今天在Debug的时候发现的NPE(NullPointerException),辛辛苦苦地调试了半天,终 ...
- Java中的Null是什么?
对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...
- Java中有关Null的9件事(转)
对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...
- java中,null值可以被强制转换为任何类型
java中,null值可以被强制转换为任何类型
- 关于 Java 中的 Null
什么是Java中的Null? null在Java中是一个非常重要的概念,它最初是为了表示缺少某些东西,例如缺少用户.资源或任何东西而发明出来的.但是这也为Java程序员带来了很多麻烦,比如最常见的空指 ...
- java中的null类型---有关null的9件事
摘自 https://blog.csdn.net/qq_25077777/article/details/80174763 今天听到一个问题,java中的null类型,null竟然是一种类型 java ...
- Java中的null值总结
自我总结,有什么不对或不到位的地方,请指出,感激不尽! 目的:熟练掌握java中null值出现的情况,避免NullPointerException 代码环境准备:需要引入junit;将代码packag ...
随机推荐
- Java实现单向链表基本功能
一.前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了.数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用- 本文主要讲解单链表的基础知识点,做一个简单 ...
- Android游戏开发之旅 View类详解
Android游戏开发之旅 View类详解 自定义 View的常用方法: onFinishInflate() 当View中所有的子控件 均被映射成xml后触发 onMeasure(int, int) ...
- Redis——常见面试题
一.memcached与redis的区别? 1.存储方式不同.memcached把数据全部存在内存之中,断电之后会挂掉,而redis虽然也用到了内存,但是会有部分数据存在硬盘中,保证数据持久性. 2. ...
- winform 适配high dpi
在 mainifest文件中添加:(新建mainifest文件的时候以下内容是有的,只要取消注释就可以了) <compatibility xmlns="urn:schemas-micr ...
- Archlinux无线联网教程
本人是学生党,故对于有线方式不甚了解,学校里一般使用mentohust用动态IP方式联网,或者直接连接wifi,这里介绍无线联网的一些方式,主要包括公共wifi和带有WEP或者WPA或者WPA2PSK ...
- Solr搜索引擎搭建详细过程
1 什么是solr Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr可以独立运行在Jetty.Tomcat等这些Servlet容器中 ...
- rcnn fast-rcnn faster-rcnn资料
---恢复内容开始--- 框架:https://github.com/rbgirshick 论文:链接: https://pan.baidu.com/s/1jIoChxG 密码: ubgm faste ...
- xxe漏洞检测及代码执行过程
这两天看了xxe漏洞,写一下自己的理解,xxe漏洞主要针对webservice危险的引用的外部实体并且未对外部实体进行敏感字符的过滤,从而可以造成命令执行,目録遍历等.首先存在漏洞的web服务一定是存 ...
- php里面的变量的使用
php里面的变量一般可以直接使用不需要声明,但是这种var_dump($a);就会报错,还有sql语句里面如果某个变量为空也会报错. 如果变量为null,空,未声明都==false,但是不===fal ...
- io文本加密
文本加密习题 package io; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Inpu ...