как установить значение proj_id как max (proj_id) 1 в java

#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.