这样写代码会报错:java.math.BigDecimal cannot be cast to java.lang.String

错误代码一:

String plantId1 = (String)map2.get("plantId");
Integer plantId = Integer.valueOf(plantId1);

错误代码二:

Integer plantId = (Integer)map2.get("plantId");

修改方法一:

BigDecimal plantId1 = (BigDecimal) map2.get("plantId");
Integer plantId = Integer.valueOf(plantId1.toString());

修改方法二:

int plantId = Integer.parseInt(String.valueOf(map2.get("plantId")));

 原因分析:

1、修改方法一:

oracle数据库中的number类型数据,java查询出来的对象属性数据类型其实为BigDecimal。

Object plantId1 = map2.get("plantId");

故可以使用(BigDecimal)进行强转:

BigDecimal plantId1 = (BigDecimal) map2.get("plantId");

但是用(String)或(Integer)做强制类型转换则会报错;因为强制类型转换是有条件的:父类强制转换为子类时只有当引用类型真正的身份为子类时才会强制转换成功,否则失败。

  在Java中我们可以通过继承、向上转型的关系使用父类类型来引用它,这个时候我们是使用功能较弱的类型引用功能较强的对象,这是可行的。但是将功能较弱的类型强制转功能较强的对象时,就不一定可以行了。在这里BigDecimal对象实例被向上转型为Object了,但是请注意这个BigDecimal对象实例在内存中的本质还是BigDecimal类型的,只不过它的能力临时被消弱了而已,如果我们想变强怎么办?将其对象类型还原!即:BigDecimal plantId1 = (BigDecimal) map2.get("plantId");

  编译器在编译时只会检查类型之间是否存在继承关系,有则通过;而在运行时就会检查它的真实类型,是则通过,否则抛出ClassCastException异常。

  在继承中,子类可以自动转型为父类,但是父类强制转换为子类时只有当引用类型真正的身份为子类时才会强制转换成功,否则失败。

Integer userId = new BigDecimal(map.get("userId").toString()).intValue();

2、修改方法二

那为什么用String.valueOf将Decimal类型转换成String就可以呢?因为String.valueOf()里面的参数转换可以是double、long、char[] 、long等等,没限制。

public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

在内部就是做了为空的判断的,所以就不会报出空指针异常。

另外使用Object.toString()方法时,如果object为null值就会报空指针异常。

posted on 2021-03-11 15:42  周文豪  阅读(11198)  评论(0编辑  收藏  举报