4

実際、私の質問全体はタイトルにあります。Invoice-Objects の 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());
     ....

したがって、DB に sth を挿入し、Str2Null = null を挿入したい場合、それは機能し、sqliteDB に NULL を書き込みますが、Flt2Null = null を使用すると、例外が発生します...なぜ誰かが私に言うことができますか??? 今まで助けてくれてありがとう...

4

1 に答える 1

13

の署名を見てくださいPreparedStatement.setFloat():

void setFloat(int parameterIndex, float x) throws SQLException

ご覧のとおりfloat、ラッパー型Floatではなくプリミティブ型を使用しているため、渡すことはできませんnullnulltype の value をFloatcausefloatに変換しようとしていますNullPointerException

Stringは参照型なので、 に渡すことができnullますPreparedStatement.setString()

したがって、setFloat()チェックしnullsetNull()渡す必要がある場合は、次のようにします。

public static void setFloatOrNull(PreparedStatement ps, int index, Float value) {
    if (value == null) {
        ps.setNull(index, Types.FLOAT);
    } else {
        ps.setFloat(index, value);
    }
}
于 2013-04-13T14:07:18.257 に答える