先看下面的代码
public static void main(String[] args) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("key", 36D);
Object object = map.get("key2");
// 转为Double
Double d1 = (Double) object;
System.out.println(d1); // null
// 转为double
double d2 = object == null ? 0 : Double.parseDouble(object.toString());
System.out.println(d2); // 0.0
Double d3 = d1 + d2; // or double d3 = d1 + d2; NullPointerException
System.out.println(d3);
}
目前我使用两种转换方式
1)转为 Double ,object 为null时,d1 也为 null
2)转为 double ,object 为null时,d2 为 0.0
对于第一种 d1,假若需要使用d1的值去计算,则会空指针异常
对于第二种 d2,则需要对object判空并赋零值,把原来的 null 改为 0 了。
所以有没有其他更好的实现方式呢?还是使用 d1或d2?
Double是double的封装类,是对象,允许null
所以Double d1 = (Double) object;虽然不报错,但是d1为null,这时候虽然不会报错,但是还是要判断一下,
double d2 =(double) object ;会报错,因为double是基本类型,只允许常量
一般程序中对象是否为null都是程序自己判断的,可以这样写:
public static void main(String[] args) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("key", 36D);
Object object = map.get("key2");
// 转为Double
Double d1 = (Double) (object == null ? 0D: object);
System.out.println(d1);
// 转为double
double d2 = (double)(object == null ? 0D: object);
System.out.println(d2);
Double d3 = d1 + d2;
System.out.println(d3);
}
}
一般来说,这种通用的类型转换都会写在程序工具类中,比如:
public static Double parseDouble(Object object){
return (Double)(object == null ? 0D: object);
}
用的时候直接调工具类的方法就行了:
public static void main(String[] args) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("key", 36D);
Object object = map.get("key");
// 转为Double
Double d1 = parseDouble(object);
System.out.println(d1);
// 转为double
double d2 = parseDouble(object);
System.out.println(d2);
Double d3 = d1 + d2;
System.out.println(d3);
}
可以保留 null,也可以赋值 0,具体看需求,但是不能让程序报错
null判断不建议在这里检测!你可以在传参时直接不能为null!
1.如果是金钱相关全部转成BigDecimal来做,用自带的加减乘除方法计算,记得参数要写精度和截取方式。
2.必须使用Double:
Double封装类型,支持为null,如果要计算只能处理一下null,不然肯定要报错的。
double基本类型,不支持null,可直接计算。