2015-01-15 66 views
1

我有一個使用屬性文件建立數據庫連接的java類。爲了將數據插入到表中,我編寫了另一個Java類,它從第一個類中獲取連接對象。嘗試將連接對象傳遞給另一個java類時出現NullPointerException

這裏是連接類調試時

package feedback; 

import java.io.IOException; 
import java.io.InputStream; 
import java.sql.*; 
import java.util.Properties; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class DbConnection { 

private static String driver = "com.mysql.jdbc.Driver"; 
private static String url = "jdbc:mysql://localhost:3306/online_feedback"; 
public static Connection con; 
static String properties[] = new String[2]; 


public static Connection connectDB() { 
    try { 
     Class.forName(driver); 
     con = DriverManager.getConnection(url, properties[0], properties[1]); 
     System.out.println("Conn obj :::" + con); 
     System.out.println(properties[0]); 
     System.out.println(properties[1]); 
    } catch (ClassNotFoundException ex) { 
     Logger.getLogger(DbConnection.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (SQLException ex) { 
     Logger.getLogger(DbConnection.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    return con; 

} 

public void loadProp() { 
    Properties prop = new Properties(); 
    InputStream input = this.getClass().getResourceAsStream("connection.properties"); 
    try { 
     prop.load(input); 
    } catch (IOException ex) { 
     Logger.getLogger(DbConnection.class.getName()).log(Level.SEVERE, null, ex); 
     System.out.println("exception " + ex); 
    } 

    String username = prop.getProperty("username"); 
    String password = prop.getProperty("password"); 

    properties[0] = username; 
    properties[1] = password; 

    System.out.println(properties[0]); 
    System.out.println(properties[1]); 

} 

public static void main(String[] args) { 

    DbConnection d = new DbConnection(); 
    d.loadProp(); 
    Connection cont = d.connectDB(); 
    System.out.println("okay " + cont); 

} 

} 

此類工作正常。它打印用戶名,密碼以及連接對象。

這裏是第二類

package feedback; 

import java.sql.Connection; 

public class Test { 


    public static void main (String[] args){ 
     Connection c = DbConnection.connectDB(); 
     System.out.println("connected " + c); 
    } 
} 

問題是它打印null作爲連接對象。

請幫我找出提前

+0

你有沒有檢查你的日誌? – 2015-01-15 16:29:01

回答

3

您得到null,因爲在致電loadProp()之前,您的Test調用DbConnection.connectDB();。如果您將main的前兩行復制到您的代碼中,則可以解決此問題。

但是,這不是一個很好的解決方法,因爲您有一個非靜態方法loadProp()修改static String properties[]數組。

您最好將loadProp()設置爲靜態。爲了做到這一點,你必須用獲得該類的靜態方法替換this.getClass() - 例如,通過使用DbConnection.class。此外,你可以在方法轉換爲靜態初始化,並避免調用它明確乾脆:

static { 
    Properties prop = new Properties(); 
    InputStream input = DbConnection.class.getResourceAsStream("connection.properties"); 
    try { 
     prop.load(input); 
    } catch (IOException ex) { 
     Logger.getLogger(DbConnection.class.getName()).log(Level.SEVERE, null, ex); 
     System.out.println("exception " + ex); 
    } 

    String username = prop.getProperty("username"); 
    String password = prop.getProperty("password"); 

    properties[0] = username; 
    properties[1] = password; 

    System.out.println(properties[0]); 
    System.out.println(properties[1]); 
} 

現在這個新main將正常工作。

2

出了什麼問題

感謝可能使你的loadProp()靜態的。那麼做到這一點:

DbConnection.loadProp(); 
Connection c = DbConnection.connectDB(); 
System.out.println("connected " + c); 

的問題是你的loadProp是一個實例方法。在構建DbConnection設置值之後,您需要調用它。您可以簡單地通過將您的loadProp靜態並在嘗試獲取連接對象之前調用它。獎金是你不需要進行構造函數調用。

一旦你調用了DbConnection.loadProp(),你的靜態值就會被設置,並且只要這個類被加載就可以使用它。因此,您可以在應用程序中調用一次,並根據需要通過connectDB連接多次。一次調用loadProp是充分和可取的(因爲您的設置不會經常變化),因爲通過Stream讀取被認爲是昂貴的,應該只在需要時才進行。

相關問題