我有一个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打印为连接对象。

请帮助我找出问题所在

提前致谢

最佳答案

之所以得到null,是因为您的Test在呼叫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将正常工作。

关于java - 尝试将连接对象传递给另一个Java类时发生NullPointerException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27968159/

10-14 12:03
查看更多