记一次开发条件表达式遇到的bug【包装类的自动拆箱】

本文通过一个实际的编程示例,探讨了Java中自动拆箱可能导致的NullPointerException问题。当尝试从可能为null的对象中获取值并转换为基本类型时,如果对象为null,就会触发此错误。解决方案是在条件表达式中使用Integer对象而不是基本类型的值,以避免不必要的自动拆箱操作,从而消除潜在的NPE风险。
摘要由CSDN通过智能技术生成

在介绍本次的文章之前,先来科普下一些基础知识

Java基本数据类型

Java基本类型共有八种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。

byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。

short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。

int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。

long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。

float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。

double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。

boolean:只有true和false两个取值。

char:16位,存储Unicode码,用单引号赋值。

基本数据类型的包装类

在这里插入图片描述

自动拆装箱

在Java SE5中,为了减少开发人员的工作,Java提供了自动拆箱与自动装箱功能。

自动装箱: 就是将基本数据类型自动转换成对应的包装类。

自动拆箱:就是将包装类自动转换成对应的基本数据类型。

以int类型为例进行自动拆装箱
int的自动装箱都是通过Integer.valueOf()方法来实现的,Integer的自动拆箱都是通过integer.intValue来实现的。

public static  void main(String[]args){
	//以下代码是 Integer integer=1; 的自动装箱操作

    Integer integer=Integer.valueOf(1); 
    // 以下代码是 int i=integer; 的自动拆箱操作
    int i=integer.intValue(); 
}

bug出现记录

其中TeamVo的对象属性和类型和InfoVo一致

package com.wanli.databoard.vo.otherVO;

import com.alibaba.fastjson.JSON;
import lombok.Data;

/**
 * @author wilsonMeng
 * @date 2021年10月06日 8:33 下午
 * @description
 */

@Data
public class TeamVo {
    //年龄
    private Integer age;
    // 是否管理 0-否 1-是
    private Integer isManage;
    // 管理的人员数量
    private Integer manageNum;


    public static void main(String[] args) {
        TeamVo vo = new TeamVo();

        //infovo 其实在真实场景中是查询数据库得到的vo 其中info有几个属性为null,使用构造方法进行模拟
        InfoVo info = new InfoVo();
        info.setAge(12);
        info.setIsManage(0);

        //判空处理 防止查询数据库得不到数据  不存在数据进行默认值处理
        vo.setAge(info == null ? 0 : info.getAge());
        vo.setIsManage(info == null ? 0 : info.getIsManage());
        vo.setManageNum(info == null ? 0 : info.getManageNum());
        System.out.println(JSON.toJSONString(vo));
    }
}

以上代码运行会进行报错,报错信息如下,定位在manageNum这一样的设值

Exception in thread "main" java.lang.NullPointerException
	at com.wanli.databoard.vo.otherVO.TeamVo.main(TeamVo.java:33)

bug原理分析

在33行中使用了条件表达式,?后面的是0,是基本数据类型,而info.getManageNum()返回的是封装类型,会进行自动拆箱,即info.getManageNum().intValue(),而infovo中的该属性为null,因此会抛出NPE。

问题解决,将上述中的0全部替换为Integer类型
``
public static void main(String[] args) {
TeamVo vo = new TeamVo();

    Integer ZERO=0;

    //infovo 其实在真实场景中是查询数据库得到的vo 其中info有几个属性为null,使用构造方法进行模拟
    InfoVo info = new InfoVo();
    info.setAge(12);
    info.setIsManage(0);

    //判空处理 防止查询数据库得不到数据  不存在数据进行默认值处理
    vo.setAge(info == null ? 0 : info.getAge());
    vo.setIsManage(info == null ? ZERO : info.getIsManage());
    vo.setManageNum(info == null ? ZERO : info.getManageNum());
    System.out.println(JSON.toJSONString(vo));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值