2015-01-15 38 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读取被认为是昂贵的,应该只在需要时才进行。

相关问题