Java中equals方法null造成空指针异常的原因及解决方案

摘要:
主体bug描述了关于null的一些你必须知道的事情:1.null是Java中的一个关键词,例如public、static和final。它区分大小写。不能将null写为null或null,编译器将无法识别它们,然后报告错误。2.就像每个原始类型都有一个默认值一样,例如,int的默认值为0,bo的默认值是0

正文

bug描述

当查找已修改的与未修改的做比较的时候,之前为null的值调用equals方法与其他值做比较的时候,会导致抛出空指针异常

知识补充

关于null,你不得不知道的几件事:

1、null是Java中的关键字,像public、static、final。它是大小写敏感的,你不能将null写成Null或NULL,编译器将不能识别它们然后报错。

2、就像每种原始类型都有默认值一样,如int默认值为0,boolean的默认值为false,null是任何引用类型的默认值,不严格的说是所有object类型的默认值。就像你创建了一个布尔类型的变量,它将false作为自己的默认值,Java中的任何引用变量都将null作为默认值。这对所有变量都是适用的,如成员变量、局部变量、实例变量、静态变量(但当你使用一个没有初始化的局部变量,编译器会警告你)。为了证明这个事实,你可以通过创建一个变量然后打印它的值来观察这个引用变量。

3、null既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型,你也可以将null转化成任何类型。

4、null可以赋值给引用变量,你不能将null赋给基本类型变量,例如int、double、float、boolean。如果你那样做了,编译器将会报错。

5、任何含有null值的包装类在Java拆箱生成基本数据类型时候都会抛出一个空指针异常。(例如Integer拆箱成int时)

6、如果使用了带有null值的引用类型变量,instanceof操作将会返回false。(instanceof:用来在运行时指出对象是否是特定类的一个实例,例如:Integer num = null,那么,调用 num instanceof Integer时会返回false)

7、不能调用非静态方法来使用一个值为null的引用类型变量,它将会抛出空指针异常;可以使用静态方法来使用一个值为null的引用类型变量,因为静态方法使用静态绑定,不会抛出空指针异常。

8、你可以使用==或者!=操作来比较null值,但是不能使用其他算法或者逻辑操作,例如小于或者大于。跟SQL不一样,在Java中null==null将返回true。

举例

假设我们现在有一个类,例如String,对于如下代码:

String str = null;
if (str.equals("Hello World!")){
    System.out.println("Yes");
}else {
    System.out.println("No");
}

就会抛出空指针异常,但是,如果我们把第二行的条件判断改为:

if ("Hello World!".equals(str))

就不会抛出空指针异常,因为String的equals方法不是Static方法

反思

为了避免内存溢出,我们在无需类外调用的方法前,一般不加static关键字(因为静态方法会常驻内存,其生存周期与整个项目的生存周期是一致的)所以,我们应该在为变量赋初值的时候,尽量不要使用null来赋初值,如果一定是null作为初值的情况,那么在进行操作时,一定要先 Assert.isNull 一下,尽量避免对null进行操作。回到equals方法上,如果一个初值可能为空的对象实例,调用equals方法时,一定要遵循 “常量”.equals(变量) 或者 后输入的.equals(之前的)。这样就可以尽量避免空指针错误,平时多注意,养成习惯,防止日后埋下隐患。

免责声明:文章转载自《Java中equals方法null造成空指针异常的原因及解决方案》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇adb(16)-查看实时资源占用情况topLUA-赋值语句下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MMKV 多进程K-V组件 SP [MD]

博文地址 我的GitHub 我的博客 我的微信 我的邮箱 baiqiantao baiqiantao bqt20094 baiqiantao@sina.com MMKV MMKV Android 安装教程 Android 使用教程 Android 进阶教程 Android 性能对比 MMKV 原理 MMKV for Android 多进程设...

C++中的动态绑定

C++中基类和派生类遵循类型兼容原则:即可用派生类的对象去初始化基类的对象,可用派生类的对象去初始化基类的引用,可用派生类对象的地址去初始化基类对象指针。 C++中动态绑定条件发生需要满足2个条件: 1:只有指定为虚函数的成员函数才能进行动态绑定,成员函数默认为非虚函数,非虚函数不能进行动态绑定 2:必须通过基类类型的引用或指针进行函数调用 基类类型引用和...

C++ | 虚函数表内存布局

虚表指针 虚函数有个特点。存在虚函数的类会在类的数据成员中生成一个虚函数指针 vfptr,而vfptr 指向了一张表(简称,虚表)。正是由于虚函数的这个特性,C++的多态才有了发生的可能。 其中虚函数表由三部分组成,分别是 RTTI(运行时类型信息)、偏移及虚函数的入口地址。而虚表与类及类生成的对象有存在着以下两种关系: 类与虚表的关系:一个类只有一个...

[Unity热更新]tolua# & LuaFramework(一):基础

一、tolua# c#调用lua:LuaState[变量名/函数名] 1.LuaState a.执行lua代码段 DoString(string) DoFile(.lua文件名) Require(.lua文件名(但没有.lua后缀)) b.获取lua函数或者表 LuaFunction func = lua.GetFunction(函数名);      ...

20145214 《信息安全系统设计基础》第11周学习总结

20145214 《信息安全系统设计基础》第11周学习总结 学习资源过程记录 关于exec.1 exec1.c代码运行如下 exec1.c中execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件 如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于err...

MFC中UpdateData函数解析

当你使用了ClassWizard(类向导)建立了控件和变量之间的联系后: 当你修改了变量的值,而希望对话框控件更新显示,就应该在修改变量后调用 UpdateData(FALSE); 如果你希望知道用户在对话框中到底输入了什么,就应该在访问变量前调用UpdateData(TRUE)。 用处: 主要控制ddx_data 把控件中的值和变量进行交换。 比如你有个...