簡體   English   中英

ClassCastException:java.lang.Double與java.math.BigDecimal不兼容

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM