![](/img/trans.png)
[英]java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.String
[英]ClassCastException: java.lang.Double incompatible with java.math.BigDecimal
這種異常以非常奇怪的方式出現。
我正在從類型為DECIMAL(15,4)的存儲過程中讀取變量的值。 在Java端,我將此值類型強制轉換為BigDecimal ,並且運行良好。 現在,我開始獲取此異常: java.lang.ClassCastException:java.lang.Double與java.math.BigDecimal不兼容,並解決此問題,我將此變量類型強制轉換為Double ,然后使用強制將其強制轉換回BigDecimal
新品:
Double myVarDb= //reading some variable's value with type-> DECIMAL(15,4) from Db end
BigDecimal myVar = (BigDecimal)BigDecimal.valueOf(myVarDb);
舊的:
BigDecimal myVar= //reading some variable's value with type-> DECIMAL(15,4)
如果萬一有人遇到此問題或不知道為什么會出現此問題,請進行指導。
更新 :我檢查了兩個驅動程序,以下是版本:
舊版:驅動程序版本:3.6.60
新:DriverVersion:3.64.106
讀取值后創建的實例類型為:
舊的:BigDecimal
新品:雙人
因此,現在的問題很清楚,為什么要獲取此異常,因為我們現在將Double對象作為默認對象。
那么,誰能闡明為什么創建這些不同類型的實例呢? 這是因為JDBC驅動程序的版本不同嗎?
為什么要獲取Double值,然后嘗試將其強制轉換為bigDecimal,這是錯誤的。 無需使其更加困難和復雜。
在Java和JDBC中,所有DECIMAL值都使用BigDecimal映射,並且有ResultSet的getBigDecimel()
方法,該方法可讓您直接將其作為BigDecimal獲取。
您將只使用以下代碼行:
BigDecimal myVar = resultSet.getBigDecimal(0);
代替所有這些(這是非常糟糕的):
Double myVarDb= resultSet.getDouble(0);
BigDecimal myVar = (BigDecimal)BigDecimal.valueOf(myVarDb);
您可以從映射SQL和Java類型中看到:
對於DECIMAL和NUMERIC類型,建議的Java映射是java.math.BigDecimal,這是一個Java類型,它也以絕對精度表示定點數。 java.math.BigDecimal類型提供數學運算,以允許與其他BigDecimal類型,整數類型和浮點類型相加,相減,相乘和除以BigDecimal類型。
建議檢索DECIMAL和NUMERIC值的方法是ResultSet.getBigDecimal。 JDBC還允許以簡單的字符串或char數組的形式訪問這些SQL類型。 因此,Java程序員可以使用getString接收DECIMAL或NUMERIC結果。 但是,這使得將DECIMAL或NUMERIC用作貨幣值的情況比較尷尬,因為這意味着應用程序編寫者必須對字符串執行數學運算。 也可以將這些SQL類型檢索為任何Java數字類型。
注意:
在您的舊代碼中,獲取強制轉換異常的原因可能是因為您未使用.getBigDecimal()方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.