簡體   English   中英

嘗試將連接對象傳遞給另一個Java類時發生NullPointerException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM