很明显,下面这段代码会出现NullPointerException!报错的位置应该在被调用方法的第一行;但是实际情况是在红色行;
public static void main(String[] args) {
Person person = new Person();
multiply(person.getWeight(),100);
}
public static double multiply(double multiplicand, double multiplier) {
BigDecimal n1 = BigDecimal.valueOf(multiplicand);
BigDecimal n2 = BigDecimal.valueOf(multiplier);
BigDecimal value = n1.multiply(n2);
return value.doubleValue();
}
一般空指针产生原因都是 object.method(); object==null;
红色行出现空指针异常第一想法应该是person为null,但是看代码person不可能为null;
查看调用方法发现方法传参为double基本类型,而null并不是基本类型,正常来讲如果传参直接为null是调用不到那个方法的,但是编译时不能知道传入参数的实际值,因此编译通过了;
但是在运行的过程中检查出来了,参数根本就不能传进方法中,因此错误报在了外面红色行;不过报空指针还是有点措手不及;
建议方法的参数定义时采用包装类型,这样异常栈会准确一点,便于排查问题;虽然NullPointerException
很明显说明了问题的根本原因,但是在排查具体哪里原因时,确实花费了很多时间,由于线上故障无法debug,光看代码真的没发现哪里会出现NullPointerException,直到debug时发现没有进入到被调用方法里面的断点才确定问题所在;