1

整数パラメータとして NULL を使用すると問題が発生します。

互いに拡張する3つのクラスがあります:

//1st
public class StandardTableIntId {
    ...

    protected MethodAnswer changeField(String field, Integer value) {
    DBConnection dbc = new DBConnection();
    Connection con = dbc.getConnection();
    try {
        PreparedStatement st = con.prepareStatement("UPDATE " + this.tableName + " SET " + field + " = ? WHERE id = ?");
        st.setInt(1, value);
        st.setInt(2, this.id);
        st.executeUpdate();
        return MethodAnswer.OK;
    } catch (SQLException ex) {
        log.info("SQLException. Class: StandardTableIntId. Method: changeField(String field, String value). Parameters: table='" + tableName + "' id='" + id + "' field='" + field + "' value='" + value + "'");
        return MethodAnswer.DB_EXCEPTION;
    }
    finally
    {
        dbc.closeConnection();
    }   
    }
    protected MethodAnswer changeField(String field, String value) {
    ...
    st.setString(1, value);
    ...}
    protected MethodAnswer changeField(String field, Long value) {
    ...
    st.setLong(1, value);
    ...}
    protected MethodAnswer changeField(String field, boolean value) {
    ...
    st.setBoolean(1, value);
    ...}
    ...
}   


//2nd
public class StandardTableIntIdTimed extends StandardTableIntId{...}

//3rd   
public class Company extends StandardTableIntIdTimed {
    ...
    public MethodAnswer setMainIncomeBankAccountId(Integer value) {
        MethodAnswer ans;
// !!! Code crashes in next command (if value==null). Eclipse just said: "Source not found." in debugging mode.
            ans = changeField("mainIncomeBaId", value); 
        return ans;
    }
    ...
}

「//!!!」とマークされた行でコードがクラッシュする コメント。「値」がnullに等しい場合に発生します。

同じメソッドで、文字列またはタイムスタンプのパラメーターはすべて問題ありません。

public MethodAnswer setPostAddress(String postAddress) {
    MethodAnswer ans;
    ans = changeField("postAddress", value); 
    return ans;
}
public MethodAnswer setDateTimeBegin(Timestamp value) {
    MethodAnswer ans;
    ans = changeField("DateTimeBegin", value); 
    return ans;
}

ここで何が起こっているのか、それを修正する方法を理解できません。

4

2 に答える 2

1

わかりました、ここで少し推測していますが...

protected MethodAnswer changeField(String field, Integer value)

このメソッド内でvalueパラメータをint, およびvalueisNULLに変換すると、 NullPointerException が発生します。解決策: valueint に変換する前に NULL かどうかを確認します。

于 2012-10-23T14:09:52.403 に答える
0

おそらく、 を使用していくつかの計算を行っていますvalue。値が null であるため、アプリケーションは NullPointerException をスローします。

例えば:

public void test(Integer n){
  System.out.println(n + 4);
}

上記のコードでは、次のコードは NullPointerException をスローします。

test(null)
于 2012-10-23T14:10:51.493 に答える