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

时间:2015-07-29 12:35:34

标签: java jdbc plsql double 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) 

如果有人遇到过这个问题或者想知道为什么会这样,请指导。

更新:我检查了两个驱动程序,以下是版本:

Old:DriverVersion:3.6.60

新:DriverVersion:3.64.106

我在读取值后创建的实例的类型为:

旧:BigDecimal

新:双重

所以现在问题很明显,为什么我们得到这个异常,因为我们现在将Double对象作为默认对象。

那么有人可以说明为什么要创建这些不同类型的实例吗? 这是因为不同版本的JDBC驱动程序吗?

1 个答案:

答案 0 :(得分:1)

为什么你会得到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);

您可以从 Mapping SQL and Java Types 中看到:

  

DECIMAL和NUMERIC类型的推荐Java映射是java.math.BigDecimal,这是一种Java类型,它也表示具有绝对精度的定点数。 java.math.BigDecimal类型提供数学运算,允许使用其他BigDecimal类型,整数类型和浮点类型添加,减去,乘以和除以BigDecimal类型。

     

建议用于检索DECIMAL和NUMERIC值的方法是   ResultSet.getBigDecimal。 JDBC还允许访问这些SQL类型   简单的字符串或char数组。因此,Java程序员可以使用   getString接收DECIMAL或NUMERIC结果。但是,这样做   DECIMAL或NUMERIC用于货币值的常见情况   相当尴尬,因为这意味着应用程序编写者必须这样做   对字符串执行数学运算也可以检索这些SQL   类型为任何Java数字类型。

注意:

在您的旧代码中,您获得强制转换异常的原因可能是因为您没有使用 .getBigDecimal()方法。