#java #jsp #servlets
#java #jsp #сервлеты
Вопрос:
я пытаюсь получить значение max (proj_id) 1 и установить значение в vo, а затем я вставляю данные в db. я пытаюсь сделать это в следующем коде, но я получаю исключение нулевого указателя….
public final class CreateProjDAO
{
private static InitialContext context;
String CLASS_NAME="DBConnectionFactory";
public void submitProjectDetails(CreateProjVO createprojVO)
{
String methodname="createConnection";
Connection conn = null;
PreparedStatement psmt;
ResultSet rs=null;
Statement st=null;
int proj_id;
try {
conn = DBConnection.getJNDIConnection();
rs=st.executeQuery("select MAX(PROJ_ID) from CR_PROJECT_DETAILS");
if(!rs.next())
{
proj_id=rs.getInt(1) 1;
System.out.println("Max:" proj_id);
}
else
{
proj_id=1;
System.out.println("Max:" proj_id);
}
createprojVO.setId(rs.getString(proj_id));
System.out.println("in DAO");
psmt= conn.prepareStatement("insert into CR_PROJECT_DETAILS(PROJ_ID,PROJ_NAME,PROJ_COST,PROJ_MANAGER) values(?,?,?,?)");
psmt.setString(1, createprojVO.getId());
psmt.setString(2,createprojVO.getName());
psmt.setString(3,createprojVO.getCost());
psmt.setString(4,createprojVO.getManager());
psmt.executeQuery();
System.out.println("conn===" conn);
conn.close();
System.out.println("Disconnected from database");
} catch (Exception e) {
e.printStackTrace(System.err);
System.out.println("data already exist");
System.out.println("error:" e);
}
}
}
Комментарии:
1. В какой именно строке вы получаете NPE?
2. и в какой строке возникает исключение?
3. в консоли я просто получаю этот java.lang. Исключение NullPointerException
4. Вы не перепутали предложения if-else?
5. Но я думаю, что вы задаете здесь неправильный вопрос. Почти во всех базах данных есть механизм для маркировки столбцов как автоинкрементных, который выполнит именно то, что вы пытаетесь сделать здесь в своем Java-коде. Использование этого вместо этого сделает ваш код более чистым и менее подверженным ошибкам. Например, ваш код может легко сломаться в многопоточной среде, такой как веб-сервер, если один поток запрашивает у базы данных идентификатор проекта, но отключается перед вставкой нового проекта. Затем другой поток запрашивает и получает тот же идентификатор, и у вас будет нарушение ключевого ограничения. Какую базу данных вы используете?
Ответ №1:
rs=st.executeQuery("select MAX(PROJ_ID) from CR_PROJECT_DETAILS");
st не был инициализирован при выполнении инструкции, таким образом, происходит NPE.