我有一个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/