浅谈 Java 中如何从根源上避免空指针

欢迎阅读本文,如有写的不足的,请见谅,请大家多多指教。
本文同时也收录在了我的个人博客网站: 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"));
    }
}

避免方式小结

  1. 使用之前一定要初始化,或检查是否初始化。
  2. 尽量避免在函数中返回 null,如果一定要返回给出详细的注释。
  3. 外部传值,除非有明确的说明(非 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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值