欢迎阅读本文,如有写的不足的,请见谅,请大家多多指教。
本文同时也收录在了我的个人博客网站: www.xilikeli.cn 中,欢迎大家来访(#.#)
也欢迎访问我的 Github 主页, 其中我的个人博客已开源在其中, 感兴趣的小伙伴可以点点 star, 不胜感激(#.#)
浅谈 Java 中如何从根源上避免空指针
几种可能产生空指针的场景演示
/**
* <p>
* 几种可能产生空指针的场景演示
* </p>
*
* @author 踏雪彡寻梅
* @version 1.0
* @date 2020/11/8
* @since JDK1.8
*/
public class NpeDemo {
public static class User {
private String name;
private String[] address;
public void print() {
System.out.println("这是用户类.");
}
public String readBook() {
System.out.println("用户阅读书籍.");
return null;
}
}
/**
* <p>
* 自定义一个运行时异常
* </p>
*/
public static class CustomException extends RuntimeException {
}
public static void main(String[] args) {
// 场景一: 调用了空对象的实例方法
// User user = null;
// user.print();
// 场景二: 访问了空对象的属性
// User user = null;
// System.out.println(user.name);
// 场景三: 当数组是一个空对象时, 取它的长度
// User user = new User();
// System.out.println(user.address);
// 产生空指针异常
// System.out.println(user.address.length);
// 场景四: null 当做 Throwable 的值, 即抛出异常时不能抛出一个内存地址为空的异常, 需要对异常进行初始化
// CustomException exception = null;
// throw exception;
// 场景五: 方法的返回值是 null, 调用方直接去使用
User user = new User();
System.out.println(user.readBook());
// 产生空指针异常
System.out.println(user.readBook().contains("MySQL"));
}
}
避免方式小结
- 使用之前一定要初始化,或检查是否初始化。
- 尽量避免在函数中返回 null,如果一定要返回给出详细的注释。
- 外部传值,除非有明确的说明(非 null 值),否则一定要及时判断。
避免空指针示例
示例 1:
// 直接打印时
System.out.println(request.getParameter("username"));
// 改为以下:
if (request.getParameter("username")) {
System.out.println(request.getParameter("username"));
} else {
// 抛出异常或其他处理
}
示例 2:
// 给对象重新赋值的时候又调用
User user = new User();
Tools tools = new Tools();
user = tools.getUser();
user.print();
// 修改方式
user = tools.getUser() == null ? new User() : tools.getUser();