繁体   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