這樣寫代碼會報錯: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值就會報空指針異常。
