2012-10-08 19 views
0

我正在創建一個執行sql查詢的servlet,它的基本版本可以工作,但是當我添加NOT IN語句時它會返回一個空指針異常。我寧願它不這樣做,而是顯示一條消息,說他們無法註冊一個主題。servlet mysql不在語句中

這裏有相關的表

user - id, name, password 

subject - id, name, user_id 

lab - id, time, room, capacity, subject_id 

user_lab - id, user_id, lab_id 

什麼,我想寫的是說,如果一個用戶是不是已經參加了一個實驗室,請打印subject.name, lab.time, lab.room

HttpSession session = request.getSession(true); 
     //Set data you want to send back to the request (will be forwarded to the page) 
     //Can set string, int, list, array etc. 

    String id = request.getParameter("id"); 
    System.out.println("beej"); 
    int user_id = 0; 

    if(id != null && (!id.equals(""))) { 
    user_id= Integer.parseInt(id); 
    } 

    String sql = "SELECT l.id,s.name,l.day,l.time,l.room" + 
       " FROM subject s, lab l " + 
       " WHERE" + 
       " s.id = l.subject_id"+ 
          " AND l.id "+"NOT IN"+ 
       "SELECT l.id"+ 
       " FROM lab ll, user_lab ul" + 
       "WHERE"+"l.id ="+"ul.lab_id" + "AND ul.user_id="+(Integer)session.getAttribute("id"); 


     try{ 
     Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/wae","root",""); 

     System.out.println(session.getAttribute("id")); 

      Statement stmt = con.createStatement(); 
      ResultSet res = stmt.executeQuery(sql); 
      System.out.println(res); 
      ArrayList<String> list1 = new ArrayList<String>(); 
      ArrayList<String> list2 = new ArrayList<String>(); 
      if (res.next()){ 
       do{ 
        list1.add(res.getString(1)); 
        list2.add(res.getString(2)+" "+res.getString(3)+" "+res.getString(4)+" "+res.getString(5)); 


       }while(res.next()); 

      String[] arr1 = list1.toArray(new String[list1.size()]); 
      String[] arr2 = list2.toArray(new String[list2.size()]); 
      System.out.println(list2); 
      request.setAttribute("res1", arr1); 
      request.setAttribute("res2", arr2); 
      request.setAttribute("user_id", user_id); 

      } 



     }catch (SQLException e) { 
     } 
     catch (Exception e) { 
     } 


     //Decides what page to send the request data to 
     RequestDispatcher view = request.getRequestDispatcher("Student_enrol.jsp"); 
     //Forward to the page and pass the request and response information 
     view.forward(request, response); 




org.apache.jasper.JasperException: java.lang.NullPointerException 
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:534) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:457) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    Student_enrol.sendBack(Student_enrol.java:104) 
    Student_enrol.doGet(Student_enrol.java:40) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 


root cause 

java.lang.NullPointerException 
    org.apache.jsp.Student_005fenrol_jsp._jspService(Student_005fenrol_jsp.java:95) 
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    Student_enrol.sendBack(Student_enrol.java:104) 
    Student_enrol.doGet(Student_enrol.java:40) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
+0

post stacktrace也。 – Azodious

+0

添加堆棧跟蹤 – user1393064

回答

0

聲明增加NOT INSELECT之間的空格

" s.id = l.subject_id"+ 
" AND l.id "+"NOT IN " +  // <== here 
"SELECT l.id"+ 

你子查詢應該是這樣的

SELECT.. 
FROM... 
WHERE l.id NOT IN 
(
    SELECT.. 
    FROM... 
) 
+0

仍然得到空指針異常。 – user1393064

+0

將'SELECT'包裝在子查詢中。 –

+0

加上子查詢 – MatBailie

0

你還需要一些空間圍繞 「WHERE」 和之前 「和」

"WHERE"+"l.id ="+"ul.lab_id" + "AND ul.user_id="+(Integer)session.getAttribute("id"); 

應該

" WHERE "+"l.id ="+"ul.lab_id" + " AND ul.user_id="+(Integer)session.getAttribute("id"); 
0

進行以下修改YOUT代碼:

if (res.next()){ 
      do{ 
       list1.add(res.getString(1)); 
       list2.add(res.getString(2)+" "+res.getString(3)+" "+res.getString(4)+" "+res.getString(5)); 


      }while(res.next()); 
     String[] arr1 = list1.toArray(new String[list1.size()]); 
     String[] arr2 = list2.toArray(new String[list2.size()]); 
     System.out.println(list2); 
     request.setAttribute("res1", arr1); 
     request.setAttribute("res2", arr2); 

到:

String[] arr1 = null; 
    String[] arr2 = null; 
    while(res.next()){ 
     list1.add(res.getString(1)); 
     list2.add(res.getString(2)+" "+res.getString(3)+" "+res.getString(4)+" "+res.getString(5)); 
     arr1 = list1.toArray(new String[list1.size()]); 
     arr2 = list2.toArray(new String[list2.size()]); 
      } 
    request.setAttribute("res1", arr1); 
    request.setAttribute("res2", arr2); 

這是因爲當您嘗試打印空列表2或訪問列表1和列表2時,它將引發錯誤。爲了避免僅在行存在時才使用它們。

並且還在查詢中的字詞之間添加空格,如John Woo所提到的: