在介绍本次的文章之前,先来科普下一些基础知识
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));
}