实际上,我的整个问题专家都在标题中。我有一个类,可以管理将发票对象插入和删除到Sqlite DB的过程。
public class Invoice {
private String str1;
private Float flt1;
private String str2Null;
private Float flt2Null;
public Invoice(String str1, Float flt1){
this.str1 = str1;
this.flt1 = flt1;
}
getters & setters...
}
public class InvoiceManager{
...Konstruktor...
public int insertInvoice(Invoice invoice) throws Exception{
try {
PreparedStatement stmt = databaseConnection.prepareStatement(
"INSERT INTO invoice (str1, flt1, str2Null, flt2Null) VALUES (?,?,?,?)");
stmt.setString(1, invoice.getStr1());
stmt.setFloat(2, invoice.getFlt1());
stmt.setString(3, invoice.getStr2Null());
stmt.setFloat(4, invoice.getFlt2Null());
....
因此,当我想向数据库中插入sth且Str2Null = null时,它可以工作,并将NULL写入sqliteDB,但是在Flt2Null = null时,它引发了异常……有人可以对我说为什么吗?
感谢您到目前为止的帮助...
最佳答案
查看PreparedStatement.setFloat()
的签名:
void setFloat(int parameterIndex, float x) throws SQLException
如您所见,它使用原始类型
float
而不是包装器类型Float
,因此您无法将null
传递给它。尝试将类型null
的Float
值转换为float
会导致NullPointerException
。String
是引用类型,因此您可以将null
传递给PreparedStatement.setString()
。因此,对于
setFloat()
,您必须检查null
并使用setNull()
传递它:public static void setFloatOrNull(PreparedStatement ps, int index, Float value) {
if (value == null) {
ps.setNull(index, Types.FLOAT);
} else {
ps.setFloat(index, value);
}
}