1

こんにちは、以下は Connection Factory クラスとして使用する私のコードです。しかし、私は java.lang.ExceptionInInitializerError を取得しています。修正方法を教えてください。これは静的ブロックによるトラップだと思いますが、これが正確に何であるかはわかりません。

package j2ee.dao;  
import java.sql.Connection;  
import java.sql.DriverManager;  
import java.util.Properties;  

public class ConnFactory  
{  
    public static  Properties prop;  
    static   
    {  
        prop=new Properties();  
        try {  
            prop.load(ConnFactory.class.getClassLoader().getResourceAsStream("DBConfig.properties"));  

        } catch (Exception e) {  
            e.printStackTrace();  
        }     
    }  

    private static ConnFactory instance = new ConnFactory();  
    public static final String URL = prop.getProperty("DEVURL");  
    public static final String USER = prop.getProperty("DEVUSER");  
    public static final String PASSWORD = prop.getProperty("DEVPASSWORD");  
    public static final String DRIVER_CLASS = prop.getProperty("DEVDRIVER_CLASS");  

    private ConnFactory() {  
        try {  
            Class.forName(DRIVER_CLASS);  
        } catch (ClassNotFoundException e) {  
            e.printStackTrace();  
        }  
    }  

    private Connection createConnection() {  
        Connection connection = null;  
        try {  
            connection = DriverManager.getConnection(URL, USER, PASSWORD);  
        } catch (Exception e) {  
            System.out.println("ERROR: Unable to Connect to Database.");  
        }  
        return connection;  
    }    

    public static Connection getConnection() {  
        return instance.createConnection();  
    }  
    public static void main(String a[])  
    {  
        Connection test=ConnFactory.getConnection();  
        System.out.println("Done");  

    }  

} 

エラー:

Caused by: java.lang.NullPointerException
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:188)
    at j2ee.dao.ConnFactory.<init>(ConnFactory.java:28)
    at j2ee.dao.ConnFactory.<clinit>(ConnFactory.java:20)
4

1 に答える 1

1
private static ConnFactory instance = new ConnFactory(); // DRIVER_CLASS is null at this point
...
public static final String DRIVER_CLASS = ...;

が初期化さConnFactoryれる前にのインスタンスを作成するため、 のコンストラクター内にあります。DRIVER_CLASSDRIVER_CLASSnullConnFactory

これらの static フィールド宣言の順序を逆にする必要があります。

public static final String DRIVER_CLASS = ...;
...
private static ConnFactory instance = new ConnFactory()

実際、私の意見では、これらの静的フィールドをまったく取り除く方がよいでしょう。それらを非静的にして、コンストラクターで初期化するだけです。

のインスタンスPropertiesをコンストラクターに渡して、接続の作成を接続プロパティのストレージから切り離すこともできます。そうすることで、さまざまなケース (たとえば、テスト環境と運用環境) でさまざまなプロパティ セットを使用できるようになります。

于 2013-11-05T10:18:31.970 に答える