认识空指针
指针:指针存放的是内存地址。
空指针:当指针不指向任何内存地址时,就叫做空指针,例如:int[] array = null。
空指针异常: 就是一个指针不指向任何内存地址,但是你还调用他了。在调用的时候就会产生空指针异常的错误,程序运行会显示Exception in thread “main” java.lang.NullPointerException的异常提示。
为什么会产生空指针异常呢?
在内存中的栈内存中开辟了一个的存储空间,而堆内存中并没有开辟相应类型的空间,所以在栈内存中没有存放任何内存地址,由此我们可以理解为什么会产生空指针异常,调用没有的东西显然时不可以的。
书写空指针
简单来说,就是定义一个基本类的对象并赋值为null,再对该对象进行调用。
String str = null;
str.toString();
解决空指针
重点关注报错发生的所在行,通过空指针异常产生的主要原因诊断具体的错误,同时为了避免空指针的发生,最好在做判断处理时将 null 或者空值放于设定的值之前。
** 报空指针异常的常见原因: **
字符串变量未初始化;
接口类型的对象没有用具体的类初始化
当一个对象的值为空时,你没有判断为空
避免空指针
这个地方我是借鉴过来的,原文博主总结了5点:
- ** 字符串比较,常量放前面 **
使用equals判断时常量在前
if(常量.equals(传入的变量)){
}
- ** 初始化默认值 **
在对象初始化的时候给它一个默认值或者默认构造实现,不要让对象直接等于null或 “” - 返回空集合
在返回一个集合的话,默认会是 null,统一规范返回一个空集合。 - 断言
断言是用来检查程序的安全性的,在使用之前进行检查条件,如果不符合条件就报异常,符合就继续。
Java 中自带的断言关键字:assert,如:
assert name == null : "名称不能为空";
输出:
Exception in thread "main" java.lang.AssertionError: 名称不正确
不过默认是不启动断言检查的,需要要带上 JVM 参数:-enableassertions 才能生效。
Java 中这个用的很少,建议使用 Spring 中的,更强大,更方便好用。
Spring中的用法:
Assert.notNull(name,"名称不能为空");
- Optional
Optional 是 JDK 8 新增的新特性,再也不用 != null 来判断了,这个在一个对象里面的多个子对象连续判断的时候非常有用。
最后附上原文链接