gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:17:02 26 4
gpt4 key购买 nike

这个异常以非常奇怪的方式出现。

我正在从类型为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

新:驱动程序版本:3.64.106

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

旧:BigDecimal

新:双

现在问题很清楚了,为什么我们会收到此异常,因为我们现在将 Double 对象作为默认对象。

那么任何人都可以解释一下为什么要创建这些不同类型的实例吗?这是因为 JDBC 驱动程序版本不同吗?

最佳答案

为什么你要获取 Double 值,然后尝试将其转换为 bigDecimal,这是错误的。没有必要让它变得更难、更复杂。

在 Java 和 JDBC 中,所有 DECIMAL 值都与 BigDecimal 映射,并且有 getBigDecimel() ResultSet 的方法允许您直接获取 BigDecimal。

您只需使用这行代码:

BigDecimal myVar = resultSet.getBigDecimal(0);

而不是所有这些(这是非常糟糕的):

Double myVarDb= resultSet.getDouble(0);
BigDecimal myVar = (BigDecimal)BigDecimal.valueOf(myVarDb);

可以从Mapping SQL and Java Types看到:

The recommended Java mapping for the DECIMAL and NUMERIC types is java.math.BigDecimal, a Java type that also expresses fixed-point numbers with absolute precision. The java.math.BigDecimal type provides math operations to allow BigDecimal types to be added, subtracted, multiplied, and divided with other BigDecimal types, with integer types, and with floating point types.

The method recommended for retrieving DECIMAL and NUMERIC values is ResultSet.getBigDecimal. JDBC also allows access to these SQL types as simple Strings or arrays of char. Thus, Java programmers can use getString to receive a DECIMAL or NUMERIC result. However, this makes the common case where DECIMAL or NUMERIC are used for currency values rather awkward, since it means that application writers have to perform math on strings. It is also possible to retrieve these SQL types as any of the Java numeric types.

注意:

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

关于java - ClassCastException : java. lang.Double 与 java.math.BigDecimal 不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31700570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com