2013-10-29 20 views
0

這是我第一次嘗試使用servlet(以及Java本身)的Java Web應用程序。我正在嘗試創建一個處理查詢,連接等的MySQL類。無論出於何種原因。我可以得到的連接,但一旦我試圖執行一個查詢,它提供了在Java Web應用程序servlets中使用MySQL類

java.lang.NullPointerException 

我敢肯定,我在做某種新秀的錯誤。但是我不清楚它是什麼。

這裏是SQL類

package coreservlets; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
//import com.mysql.jdbc.*; 


public class DBInterface { 
    private static Connection conn; 
    private Statement statement; 

    public static Connection Conn() throws SQLException, ClassNotFoundException { 
     String url = "jdbc:mysql://localhost:3306/cmwebapp"; 
     String user = "user"; 
     String pw = "password"; 

     try{ 
      //Class.forName("com.mysql.jdbc.Driver").newInstance(); 
      Class.forName("com.mysql.jdbc.Driver"); 
     conn = (Connection) DriverManager.getConnection(url, user, pw); 
     //System.out.println(conn.getAutoCommit()); 
     } catch (SQLException e) { 
      System.out.println("MySQL Connection failed."); 
      e.printStackTrace(); 
     } 
     return conn; 
    } 

    public ResultSet Query(String query){ 
     try{ 
     statement = (Statement) conn.createStatement(); 
     ResultSet rs = statement.executeQuery(query); 
     System.out.println(rs); 
     return rs; 
     }catch(Exception e){ 
      System.out.println("TestServlet.java SQL connection failed."); 
      e.printStackTrace(); 
      return null; 
     } 
    } 
} 

類我想叫它

package internalLogic; 
import coreservlets.*; 

import java.io.*; 
import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class TheWork { 
    private DBInterface conn; 
    private String param; 
    private ResultSet set; 

    public TheWork(String p){ 
     try { 
       conn = (DBInterface) DBInterface.Conn(); 
       param = "SELECT * FROM test WHERE index =" + p ; 
      } catch(Exception e) { 
       System.out.println("In TheWork ctor SQL connection or variable assignment failed."); 
       e.printStackTrace(); 
      } 
    } 

    public String Execute(){ 
     set = conn.Query(param); 
     System.out.println(set); 
     Object s = null; 
     String ret = ""; 
     try{ 
      while (set.next()) { 
       // Make container class for SQL result sets. 
       if(s instanceof String){ 
        s = set.getObject("index");   
       } 
       if (s instanceof Integer){ 
        s = String.valueOf(s); 
       } 
       ret += s + ", "; 
      } 
      return ret; 
     }catch(Exception e){ 
      System.out.println("In TheWork Execute SQL connection or variable assignment failed."); 
      e.printStackTrace(); 
      return null; 
     } 
    } 
} 

由於任何人誰願意幫助我。

Oct 29, 2013 9:51:03 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [Test] in context with path [/test-app] threw exception 
java.lang.NullPointerException 
    at internalLogic.TheWork.Execute(TheWork.java:26) 
    at testPackage.TestServlet.doGet(TestServlet.java:32) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
+0

哪裏異常發生的?發佈完整的堆棧跟蹤。 –

+0

你的NPE在哪裏發生? – Julien

+0

只是一個註釋:這部分:''SELECT * FROM test WHERE index =「+ p;'實在是非常糟糕的事情。它會讓你的代碼在SLQ注入攻擊時容易受到攻擊。改用準備好的陳述。另外,在CRUD操作完成後關閉連接。 –

回答

0

在你Execute()方法實例conn可能是null。 我認爲在你的TheWork類:

private DBInterface conn; 

應該

private Connection conn; 

,並在構造函數中

conn = (DBInterface) DBInterface.Conn(); 

應該是簡單的

conn = DBInterface.Conn(); 

更新:(上面提出的更正建議無效)

在您最後發表評論後,我意識到發生了什麼;真正的問題是您需要從Conn()方法中返回DBInterface的實例。 如果你把你原來的代碼,並僅更改方法Conn()像我一樣下面,就應該解決這個問題...

public static DBInterface Conn() throws SQLException, ClassNotFoundException { 
    String url = "jdbc:mysql://localhost:3306/cmwebapp"; 
    String user = "user"; 
    String pw = "password"; 
    DBInterface dbInterface = new DBInterface(); 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
     dbInterface.conn = (Connection) DriverManager.getConnection(url, user, pw); 
    } catch (SQLException e) { 
     System.out.println("MySQL Connection failed."); 
     e.printStackTrace(); 
    } 
    return dbInterface; 
} 
+0

我曾經這樣做過一次。如果我這樣做,當我在TheWork中調用conn.Query(param)。我收到一個錯誤,說我應該將它投射到DBInterface。這消除了錯誤,但是當我運行應用程序時,出現此錯誤:java.lang.ClassCastException:com.mysql.jdbc.JDBC4Connection無法轉換爲coreservlets.DBInterface – scallopboat

+0

@scallopboat我已更新我的答案,希望這會解決你的問題! – Paolo

+0

對不起延遲複選標記。感謝你的幫助! – scallopboat