正文

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(之前的)。这样就可以尽量避免空指针错误,平时多注意,养成习惯,防止日后埋下隐患。

最新文章

  1. S3C2440UART之FIFO
  2. Python的平凡之路(10)
  3. java和linux的编码
  4. javascript中parentNode,childNodes,children的应用详解
  5. Lucas的数论题解
  6. PAT 解题报告 1052. Linked List Sorting (25)
  7. ADO.NET访问SQL Server调用存储过程带回参
  8. WebConfig特殊字符的转义!
  9. 2014 I/O归来:Google连接一切
  10. C#开发学习——常用的正则表达式
  11. Webpack学习笔记(二)
  12. html元素中class属性值多个空格分格是什么意思?
  13. js跨域访问,No ‘Access-Control-Allow-Origin‘ header is present on
  14. CDockablePane 记忆界面布局的问题
  15. word加载项打包发布注意事项总结
  16. I/O------字节输出流
  17. oc语言的Foundation框架(学习笔记1)
  18. JEECG 开源平台全视频和文档
  19. git的介绍
  20. 递归n!

热门文章

  1. 计算机基础与python安装
  2. 服务器爆满:cannot create temp file for here-document: No space left on device
  3. 关于ManualResetEvent的实例分析
  4. ES6入门:数据劫持、Proxy、Reflect
  5. JS实现旋转的魔方
  6. iOS13新坑(转自Cocoachina)
  7. Apache httpclient的execute方法调试
  8. Django获取用户form表单
  9. day_02比特币的转账机制及其7个名词
  10. 13_Redis_持久化