Scala 抛出异常以从查询结果中读取 null bigdecimal
Scala throw exception for reading null bigdecimal from query result
我有一个方法体是这样的:
try {
val query = "SELECT decimalValue as decimal_value FROM table";
val con = new DbConnection
val statement = con.preparedStatement(query)
val rset = statement.executeQuery()
var myDecimalValue = 0
if (rset.next()) {
myDecimalValue = rset.getBigDecimal("decimal_value")
}
}
catch {
case e: Exception => println(e.getMessage)
}
如果查询结果为空,我得到一个异常:null value for BigDecimal
但是,从 ResultSet.java
的 getBigDecimal
方法中,我找到了这个定义:
* @return the column value (full precision);
* if the value is SQL <code>NULL</code>, the value returned is
* <code>null</code> in the Java programming language.
如何避免这种情况?如果我知道结果可以包含空值,我真的需要像这样(如下)将我的参数声明为选项?!:
var myDecimalValue: Option[BigDecimal] = Option(BigDecimal(0))
和内部 if:
val rsetValue = rset.getBigDecimal("decimal_value")
if (rsetValue != null) myDecimalValue = Option(rsetValue)
更新:stracktrace
java.lang.IllegalArgumentException: null value for BigDecimal
at scala.math.BigDecimal.<init>(BigDecimal.scala:405)
at scala.math.BigDecimal$.apply(BigDecimal.scala:333)
at scala.math.BigDecimal$.apply(BigDecimal.scala:330)
at scala.math.BigDecimal$.javaBigDecimal2bigDecimal(BigDecimal.scala:345)
at ...
at ...
at ...
at java.lang.Thread.run(Thread.java:748)
您真的不希望 null
泄漏到 Scala 代码中。当与可以 return null
的 Java 代码交互时,最好的方法是将结果包装到 Option(x)
中。这将负责将 null
变成 None
。
也避免var
,更喜欢val
。
所以您的程序的直接修复是
val myDecimalValue = if (rs.next) Option(rs.getBigDecimal("decimal_value")) else None
但除此之外我还会做的是找到一个合理的数据库访问库。 Slick 或 Doobie 等完整的 Scala 解决方案对初学者来说可能有点挑战,但原始 JDBC 太痛苦了。也许像 Apache DbUtils?没有人需要手动迭代结果集并将列提取到变量中。您应该从该库中取回模型 类 的列表。
我有一个方法体是这样的:
try {
val query = "SELECT decimalValue as decimal_value FROM table";
val con = new DbConnection
val statement = con.preparedStatement(query)
val rset = statement.executeQuery()
var myDecimalValue = 0
if (rset.next()) {
myDecimalValue = rset.getBigDecimal("decimal_value")
}
}
catch {
case e: Exception => println(e.getMessage)
}
如果查询结果为空,我得到一个异常:null value for BigDecimal
但是,从 ResultSet.java
的 getBigDecimal
方法中,我找到了这个定义:
* @return the column value (full precision);
* if the value is SQL <code>NULL</code>, the value returned is
* <code>null</code> in the Java programming language.
如何避免这种情况?如果我知道结果可以包含空值,我真的需要像这样(如下)将我的参数声明为选项?!:
var myDecimalValue: Option[BigDecimal] = Option(BigDecimal(0))
和内部 if:
val rsetValue = rset.getBigDecimal("decimal_value")
if (rsetValue != null) myDecimalValue = Option(rsetValue)
更新:stracktrace
java.lang.IllegalArgumentException: null value for BigDecimal
at scala.math.BigDecimal.<init>(BigDecimal.scala:405)
at scala.math.BigDecimal$.apply(BigDecimal.scala:333)
at scala.math.BigDecimal$.apply(BigDecimal.scala:330)
at scala.math.BigDecimal$.javaBigDecimal2bigDecimal(BigDecimal.scala:345)
at ...
at ...
at ...
at java.lang.Thread.run(Thread.java:748)
您真的不希望 null
泄漏到 Scala 代码中。当与可以 return null
的 Java 代码交互时,最好的方法是将结果包装到 Option(x)
中。这将负责将 null
变成 None
。
也避免var
,更喜欢val
。
所以您的程序的直接修复是
val myDecimalValue = if (rs.next) Option(rs.getBigDecimal("decimal_value")) else None
但除此之外我还会做的是找到一个合理的数据库访问库。 Slick 或 Doobie 等完整的 Scala 解决方案对初学者来说可能有点挑战,但原始 JDBC 太痛苦了。也许像 Apache DbUtils?没有人需要手动迭代结果集并将列提取到变量中。您应该从该库中取回模型 类 的列表。