根据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
可以为空。
答案 0 :(得分:8)
这一行
p_stmt.setInt(1, i);
编译为
p_stmt.setInt(1, i.intValue());
由于i
引用null
,您将获得NullPointerException
。
Java Language Specification更详细地解释了这一点。
在运行时,取消装箱转换过程如下:
- [...]
- 如果
r
是Integer
类型的引用,则取消装箱转化会将r
转换为r.intValue()
- 如果
r
为null
,则取消装箱转化会引发NullPointerException