2012-08-03 71 views
1
public static Connection connect; 
    public static ResultSet resultSet; 
    static final String DATABASE_URL = "jdbc:mysql://localhost/java_dev"; 

    public ServerFunctions() { 
     String Driver = "com.mysql.jdbc.Driver";    
     String DB_USERNAME = "lucky"; 
     String DB_PASSWORD = "lucky"; 

     try { 
      Class.forName(Driver); 
      connect = DriverManager.getConnection(DATABASE_URL,DB_USERNAME, DB_PASSWORD); 
     } catch(Exception e) { 
      System.out.println("Database Not Connected ! "); 
     } 
    } 

    public static Boolean verificator(String username, String password) { 
     try { 
      PreparedStatement prepare = connect.prepareStatement(
       "Select * from users where username='?'&&password='?'"); 

以上是我的代碼片段。我聲明ConnectionResultset對象是靜態的,因此可以從靜態驗證器方法調用它們。 此外,驗證方法被聲明爲靜態的,這樣它可以通過使用className.verificator(param,param)從不同的類作爲類變量進行調用。可以在java中聲明靜態對象嗎?

它編譯和運行,當我單獨測試類,但然後我得到的PerparedStatement行時,每當有不同的類的調用時出現NullPointerException錯誤。

是否有人請幫助我爲什麼它發生?

三江源

+2

一些註釋:如果您使用的是準備好的語句,則不需要將字符串參數括在引號中。你可以改用'Select * from username where username =? &&密碼=?'。如果你認真對待用戶驗證,那麼首先要知道你做錯了,並且有許多在線幫助參考(例如http://crackstation.net/hashing-security.htm)。另外,您不要將「對象」設置爲靜態,而是將該對象的_reference_設置爲靜態 - 對象本身的生命不管您如何引用它。 – kbolino 2012-08-03 13:23:23

+0

讓你:)我糾正了那些東西:) thanx – 2012-09-09 13:45:49

回答

9

你說你聲明驗證方法是靜態的,所以它可以從其他類訪問,而驗證方法使用的連接也是靜態的。

問題是連接只是在對象的構造函數中初始化的,所以如果構造函數永遠不會被調用,連接將是空的。

您需要在靜態塊中初始化您的連接變量,或者在使用它之前驗證它是否爲空。

+0

uhmmm ...謝謝。我知道了。從另一個班級調用時,它永遠不會被初始化。 謝謝丟失的Sir – 2012-08-03 13:20:01

+0

沒有什麼比在StackOverflow中說「謝謝」接受正確的答案。不客氣。 =) – pcalcao 2012-08-03 16:30:25

1

你得到了NullPointerException,因爲你不初始化變量。嘗試類似

public static ResultSet resultSet = new ResultSet(); 

或之前運行功能至極初始化變量訪問它們。

1

這意味着您的Connection對象已關閉或未正確初始化(通過調用構造函數)。我強烈建議不要使用諸如ConnectionResultSet之類的靜態資源,而是使它們成爲基於實例並從靜態方法調用該實例。

1

構造函數在構造類的實例時執行,也就是當您使用關鍵字new時。通過在創建ServerFunctions的實例之前使用靜態connect變量,構造函數不會被執行。

你可以使用一個靜態初始化塊來糾正這個問題,當這個類被加載的時候會被執行。

static{ 
    //code from your constructor here 
} 
2

可以將對象聲明在Java靜態?

你可以,但這是一個壞主意。

public static Boolean verificator(String username, String password) { 
    try { 
     synchronized(DATABASE_URL){ 
      if(connect==null){ 
       Class.forName(Driver); 
       connect = DriverManager.getConnection(DATABASE_URL,DB_USERNAME, DB_PASSWORD); 
      } 
     } 

     PreparedStatement prepare = connect.prepareStatement(
相關問題