Scala 抛出异常以从查询结果中读取 null bigdecimal

爱乐思

我有一个像这样的身体的方法:

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

但是,从我的getBigDecimal方法中ResultSet.java找到了这个定义:

* @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.

如何避免这种情况?我真的需要像这样(如下)将我的参数声明为 Option,如果我知道结果可以包含空值?!:

var myDecimalValue: Option[BigDecimal] = Option(BigDecimal(0))

和内部如果:

val rsetValue = rset.getBigDecimal("decimal_value")
if (rsetValue != null) myDecimalValue = Option(rsetValue)

更新:跟踪

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 代码中。当与可以返回nullJava 代码交互时,最好的方法是将结果包装到Option(x). 这将照顾null变成None.

也避免var,更喜欢val

所以对你的程序的直接修复是

val myDecimalValue = if (rs.next) Option(rs.getBigDecimal("decimal_value")) else None

但除此之外我还会做的是找到一个合理的数据库访问库。像 Slick 或 Doobie 这样的完整 Scala 解决方案对初学者来说可能有点挑战,但原始 JDBC 太痛苦了。也许像Apache DbUtils?没有人需要手动迭代结果集并将列提取到变量中。您应该从该库中取回模型类列表。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章