2013-07-31 62 views
0

在一個簡單的servlet代碼中,
我得到一個NULLPointerException查詢準備好的語句時拋出。

據我所知,當一個對象定義null被賦予一些新的值時拋出空指針異常。

但我不知道如何更改以下代碼才能正常運行。
servlet中發生空指針異常嗎?

import java.sql.*; 

public class DataLogic { 
    static Connection con; 
    static PreparedStatement ps; 
    static ResultSet rs; 

    DataLogic() { 
      try{ 
       Class.forName("com.mysql.jdbc.Driver"); 
       con=DriverManager.getConnection("jdbc:mysql://localhost:3306/student","root",""); 
      } catch(Exception e){ 
       e.printStackTrace(); 
      } 
    } 

    public static boolean login(String user, String pass) { 
     boolean b=false; 
     try{ 
     /*Exception thrown in next line*/ 
      ps=con.prepareStatement("select * from login where uname=? and pass like ?"); 
      ps.setString(1, user); 
      ps.setString(2, pass); 
      rs=ps.executeQuery(); 
      //System.out.print(b=rs.next()); 
     } catch(Exception e){ 
      e.printStackTrace(); 
     } 
     return b; 
    } 

} 

PS:這是從一個servlet調用的。

更新:

顯示java.lang.NullPointerException 在data.DataLogic.login(DataLogic.java:22) 在serv.login.doPost(login.java:35) 在SERV。 login.doGet(login.java:26) at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) at org。 apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilt ER(ApplicationFilterChain.java:210) 在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at org.apache.catalina.valves.ErrorReportValve。調用(ErrorReportValve.java:99) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) a牛逼org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 在org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:589) 在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(未知來源) Blockquote

請幫助。提前預測。

+2

請發佈異常堆棧跟蹤。 – sleske

+0

@sleske:堆棧跟蹤在NPE中通常是無益的。如果OP本身告訴哪個變量哪一行是'null'(因爲OP已經在代碼註釋中做了),它會更有幫助。由於構造函數中的異常處理完全中斷,'con'變量只是'null'。 Harvish,你有這個代碼中的其他嚴重問題:http://stackoverflow.com/questions/9428573/is-it-safe-to-use-a-static-java-sql-connection-instance-in-a-多線程系統/ – BalusC

+3

狂野未受教育的猜測:您在調用'DataLogic.login(...)'之前沒有實例化一個'DataLogic'對象,所以沒有'con'對象。 – mthmulders

回答

3

聽起來像Class.forNameDriverManager.getConnection失敗,所以con從未被分配一個非空值。

不是隻在那裏打印堆棧跟蹤,而是拋出一個異常 - 如果你想要的話可​​能是運行時異常(因爲你不能真正「處理」這種情況)。然後,您可以儘快找到錯誤,而不是假裝構造函數已正確成功。吞嚥這樣的例外幾乎總是只是延遲了一個問題,而不是修復它,這使得以後診斷更加困難。

+0

偉大的Jon Skeet! 謝謝! 我的系統中的mysqlconnector已經移動。 這就是爲什麼Class.forName()失敗 對不起,基本的錯誤。 – harvish

0

空指針表示行;

ps=con.prepareStatement("select * from login where uname=? and pass like ?"); 

東西是空的,這一行只有con可以爲空。因此,我假定你在對象的一個​​實例被構造得太初始化之前調用靜態方法con

0

您發佈的代碼無法正常工作。您正在初始化對象的構造函數中的con變量。

訪問該對象的方法是在一個靜態方法中,它需要之前調用任何對象的構造函數。

請不要混淆靜態和非靜態方法。如果您要求登錄方法是靜態的,則在靜態初始化器中初始化連接。但是,我沒有看到在這種情況下使用靜態方法的原因。

0

您聲明「登錄」方法爲靜態! 這意味着它的實例更少,或者換句話說,構造函數永遠不會被稱爲bevor。你沒有通過你的調試器運行它嗎?

你可以做類似

public static boolean login(String user, String pass) { 
     DataLogic logic = new DataLogic(); 
     boolean b=false; 
     try{ 
     /*Exception thrown in next line*/ 
      ps=logic.con.prepareStatement("select * from login where uname=? and pass like ?"); 
      ps.setString(1, user); 
      ps.setString(2, pass); 
      rs=ps.executeQuery(); 
      //System.out.print(b=rs.next()); 
     } catch(Exception e){ 
      e.printStackTrace(); 
     } 
     return b; 
    } 

對於這個您的變量「CON」必須是公共的,或者你必須提供一個getter方法。