java PreparedStatement.setFloat抛出NullpointerException,Pstmt.setString是否允许?

java PreparedStatement.setFloat抛出NullpointerException,Pstmt.setString是否允许?,java,prepared-statement,Java,Prepared Statement,实际上,我的整个问题都在标题里。我有一个类,用于管理发票对象对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;

实际上,我的整个问题都在标题里。我有一个类,用于管理发票对象对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()的签名。

如您所见,它使用原语类型
float
而不是包装类型
float
,因此您不能将
null
传递给它。尝试将
Float
类型的
null
值转换为
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);
    }
}

这看起来不太正确,您的sql查询无法编译。我无法确定列名是变量还是字符串的一部分。请更正您的疑问。另外,考虑使用帮助了我很多…非常感谢!
public static void setFloatOrNull(PreparedStatement ps, int index, Float value) {
    if (value == null) {
        ps.setNull(index, Types.FLOAT);
    } else {
        ps.setFloat(index, value);
    }
}