【问题标题】:What to expect with PreparedStatement::setInt null input [duplicate]PreparedStatement::setInt null 输入会发生什么
【发布时间】:2014-03-27 00:57:35
【问题描述】:

根据this question/answer,这段代码:

try(PreparedStatement p_stmt = connection.prepareStatement(sql)) {
    p_stmt.setString(1, null);
    ...
}

相当于:

try(PreparedStatement p_stmt = connection.prepareStatement(sql)) {
    p_stmt.setNull(1, java.sql.Types.VARCHAR);
    ...
}

我的问题是,这与int / Integer 一样吗?换句话说,这段代码会做什么:

try(PreparedStatement p_stmt = connection.prepareStatement(sql)) {
    Integer i = null;
    p_stmt.setInt(1, i);
    ...
}

setInt() 接受一个不能为空的基元int,但未装箱的Integer 可以为空。

【问题讨论】:

  • This answer in your own link 回答了这个问题。

标签: java prepared-statement autoboxing


【解决方案1】:

这一行

p_stmt.setInt(1, i);

编译成

p_stmt.setInt(1, i.intValue());

由于i 引用null,您将获得NullPointerException

这在Java Language Specification 中有更详细的解释。

在运行时,拆箱转换过程如下:

  • [...]
  • 如果rInteger 类型的引用,则拆箱转换会将r 转换为r.intValue()
  • 如果rnull,拆箱转换会抛出NullPointerException

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-08
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    相关资源
    最近更新 更多