实际上,我的整个问题专家都在标题中。我有一个类,可以管理将发票对象插入和删除到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传递给它。尝试将类型nullFloat值转换为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);
    }
}

10-04 17:26