![](/img/trans.png)
[英]Getting a NullPointerException when trying to pass an ArrayList to another class
[英]NullPointerException when trying to pass connection object to another java class
我有一個Java類,它使用屬性文件建立數據庫連接。 為了向表中插入數據,我編寫了另一個Java類,該類從第一個類獲取連接對象。
這是連接類
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打印為連接對象。
請幫助我找出問題所在
提前致謝
因為Test
調用DbConnection.connectDB();
所以您得到null
DbConnection.connectDB();
在調用loadProp()
。 如果將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
將正常工作。
可能使您的loadProp()靜態。 然后執行以下操作:
DbConnection.loadProp();
Connection c = DbConnection.connectDB();
System.out.println("connected " + c);
問題是您的loadProp是實例方法。 在構造DbConnection來設置值之后,需要調用它。 您可以簡單地通過將loadProp設置為靜態並在嘗試獲取連接對象之前調用它來使其變得更容易。 好處是您不需要進行構造函數調用。
調用DbConnection.loadProp()后,將設置靜態值,並且只要加載了類,靜態值就可用。 因此,您可以在應用程序中調用它一次,並通過connectDB根據需要獲得多次連接。 一次調用loadProp是足夠的並且是可取的(假設您的設置不經常更改),因為通過Stream進行讀取被認為是昂貴的,僅應在需要時執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.