![](/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.