空指针异常相关及预防办法

本文结合网上搜索和实践解决的办法整理

1.空指针异常

(实际上指的是java的引用)
简单理解:空指针就是空引用;引用本身为空,却用他调用了方法和属性
null是所有引用类型的默认值,如果没有让一个引用指向一个实际存在的对象,它的默认值就是null。
一般在定义变量的时候都会进行初始化(这也是写代码的一个良好的习惯)

2.如何避免

2.1.最好调用已知的String对象的equals()和equalsIgnoreCase()方法

例:a.equals(b)和b.equals(a)是完全不同的;

2.2.String.valueOf(a)和a.toString()

不知道对象是不是null时,请使用String.valueOf(a);因为null对象的toString()会抛出空指针异常

2.3.使用null安全的方法和库

有很多开源库已经做了繁重的空指针检查工作,其中最常用的是Apcahe commons 中的StringUtils。你可以使用StringUtils.isBlank(),siName(),isWhiteSpace()以及其他的工具方法

StringUtils.isEmpty(null):true
StringUtils.isBlank(null):true
StringUtils.isNumeric(null):false
StringUtils.isAllUpperCase(null):false

2.4.避免从方法中返回空指针,而是返回空collection或者空数组

这个Java最佳实践或技巧由Joshua Bloch在他的书Effective Java中提到。这是另外一个可以更好的使用Java编程的技巧。通过返回一个空collection或者空数组,你可以确保在调用如size(),length()的时候不会因为空指针异常崩溃。Collections类提供了方便的空List,Set和Map: Collections.EMPTY_LIST,Collections.EMPTY_SET,Collections.EMPTY_MAP。这里是实例:

public List getOrders(Customer customer){List result = Collections.EMPTY_LIST;return result;
}

2.5.使用annotation @NotNull 和 @Nullable

可以自定义是否为空指针,详情自行百度;技巧对程序猿来说比较新,需一段时间

2.6.避免代码中不必要的自动装包和自动解包

且不管其他如创建临时对象的缺点,如果wrapper类对象是null,自动包装同样容易导致空指针异常。例如如果person对象没有电话号码的话会返回null,如下代码会因为空指针异常崩溃。

Person ram = new Person("ram");
int phone = ram.getPhone();

当使用自动包装和自动解包的时候,不仅仅是等号,< > 同样会抛出空指针异常。可以自行百度来学习更多的Java中的自动包装和自动解包的陷阱。

2.7.遵从Contract并定义合理的默认值

在Java中避免空指针异常的一个最好的方法是简单的定义contract并遵从它们。大部分空指针异常的出现是因为使用不完整的信息创建对象或者未提供所有的依赖项。如果你不允许创建不完整的对象并优雅地拒绝这些请求,你可以在接下来的工作中预防大量的空指针异常。类似的,如果对象允许创建,你需要给他们定义一个合理的默认值。例如一个Employee对象不能在创建的时候没有id和name,但是是否有电话号码是可选的。现在如果Employee没有电话号码,你可以返回一个默认值(例如0)来代替返回null。但是必须谨慎选择,有时候检查空指针比调用无效号码要方便。同样的,通过定义什么可以是null,什么不能为null,调用者可以作出明智的决定。failing fast或接受null同样是一个你需要进行选择并贯彻的,重要的设计决策。

2.8.定义数据库中的字段是否可为空

如果你在使用数据库来保存你的域名对象,如Customers,Orders 等,你需要在数据库本身定义是否为空的约束。因为数据库会从很多代码中获取数据,数据库中有是否为空的检查可以确保你的数据健全。在数据库中维护null约束同样可以帮助你减少Java代码中的空指针检查。当从数据库中加载一个对象时你会明确,哪些字段是可以为null的,而哪些不能,这可以使你代码中不必要的!= null检查最少化。

2.9.使用空对象模式(Null Object Pattern)

还有一种方法来避免Java中的空指针异常。如果一个方法返回对象,在调用者中执行一些操作,例如Collection.iterator()方法返回迭代器,其调用者执行遍历。假设如果一个调用者并没有任何迭代器,其可以返回空对象(Null object)而非null。空对象是一个特殊的对象,其在不同的上下文中有不同的意义。例如一个空的迭代器调用hasNext()返回false时,可以是一个空对象。同样的在返回Container和Collection类型方法的例子中,空对象可以被用来代替null作为返回值。

NullPointException空指针异常相关及预防办法相关推荐

  1. NullPointException空指针异常

    先拿一个例子来开头吧 User user = new User("123",null); if (user.getPassword().equals("123" ...

  2. 空指针异常 NullPointException

    空指针异常 NullPointException 空指针异常,是运行时异常,及时编写代码时出现了空指针异常,编译器(javac) 会编译通过不报错,但是运行时Runtime阶段会抛出NullPoint ...

  3. Android开发中遇到的bug

    1.将Eclipse项目导入到Android studio 中 很多点9图出现问题解决方法 在build.gradle里添加以下两句: aaptOptions.cruncherEnabled = fa ...

  4. classcastexception异常_内部类、异常以及 LeetCode 每日一题

    1 内部类 内部类的作用: 内部类提供了更好的封装,可以把内部类隐藏于外部类之内,不允许同一个包中的其他类访问该类.(例如给"牛"这个类组合一个"牛腿",则可以 ...

  5. 那年我整理的SE面试题

    JavaSE基础知识 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有个public的类,并且public的类名必须与文件名保持 ...

  6. java 异常处理的关键字_java异常,异常处理,异常类 关键字:throws 和 throw 自定义的异常类...

    packagecn.kecheng;importjava.util.Scanner;/**异常:异常是指在程序的运行过程中所发生的不正常的情况,它会中断正在运行的程序 异常处理机制:java中通过异常 ...

  7. Kotlin学习笔记五、控制语句

    一.条件分支 a.简单分支 最简单的条件分支莫过于if-else- var mod = System.currentTimeMillis() % 3 if (mod == 0L){println(&q ...

  8. 一般人我不告诉的bug

    http://blog.csdn.net/axi295309066/article/details/52745694 1.将Eclipse项目导入到Android studio 中 很多点9图出现问题 ...

  9. Java面试题总结-2022版

    目录 一.Java 基础 1. JDK 和 JRE 有什么区别? 2. == 和 equals 的区别是什么? 3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗 ...

最新文章

  1. JS实现录音,播放完整代码带示例图
  2. boost::process::environment相关的测试程序
  3. C++ static的作用
  4. 【Linux】一步一步学Linux——declare命令(217)
  5. Jenkins 随笔
  6. wifi名称可以有空格吗_收购公司后可以变更公司名称吗,变更公司名称和股权如何处理?...
  7. C - Swaps 2(树状数组,思维)
  8. 掌握 React 与 React Native
  9. 响应式API的设计、实现和应用
  10. qpushbutton 添加本地文件图标_1.PyQt5实现多文件调用以及UI和逻辑分离
  11. 一行代码,能导入所有Python库!
  12. 智能家居通信协议科普,什么户型选择什么产品一文看懂
  13. axios 中文文档
  14. java中常量池存的是什么_Java中常量池是什么?Java常量池的介绍
  15. 计算机分区gpt无法启动项,双系统引导失败怎么修复?用bcd编辑MBR/GPT教程
  16. linux桌面图标恢复,修复桌面白图标的教程
  17. linux nginx root权限问题,nginx权限问题failed(13:Permission denied)
  18. 如何做一份详细的百度推广投放方案
  19. 无线电通信相关重要指标测试
  20. python 将JS(JavaScript)的json格式字符串转换为python的字典格式

热门文章

  1. 实战:在域环境安装和配置企业CA
  2. 知识图谱这么火,本文带你揭秘它的前世今生!
  3. 蓝桥杯C/C++每日一练之十六进制转八进制
  4. 发黄图、泼脏水,为了搞垮对手,Soul 到底有多努力,他们到底是如何发展起来的呢?...
  5. 数字图像处理——引言
  6. 在docker容器里,ffmpeg给视频文件内嵌字幕文件,不生效,如何解决?
  7. python将excel数据合并_在Excel中使用Python将每日数据合并为月度数据
  8. jsplumb应用场景快速开发
  9. Dynamo For Revit:房间编号
  10. 中间人攻击HTTPS可行性分析