使用PreparedStatement :: setInt null输入可以期待什么

时间:2014-02-25 02:28:24

标签: java prepared-statement autoboxing

根据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可以为空。

1 个答案:

答案 0 :(得分:8)

这一行

p_stmt.setInt(1, i);

编译为

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

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

Java Language Specification更详细地解释了这一点。

  

在运行时,取消装箱转换过程如下:

     
      
  • [...]
  •   
  • 如果rInteger类型的引用,则取消装箱转化会将r转换为r.intValue()
  •   
  • 如果rnull,则取消装箱转化会引发NullPointerException
  •