整数パラメータとして 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;
}
ここで何が起こっているのか、それを修正する方法を理解できません。