1
public static Connection connect;
    public static ResultSet resultSet;
    static final String DATABASE_URL = "jdbc:mysql://localhost/java_dev";

    public ServerFunctions() {
        String Driver = "com.mysql.jdbc.Driver";            
        String DB_USERNAME = "lucky";
        String DB_PASSWORD = "lucky";

        try {
            Class.forName(Driver);
            connect = DriverManager.getConnection(DATABASE_URL,DB_USERNAME, DB_PASSWORD);
        } catch(Exception e) {
            System.out.println("Database Not Connected ! ");
        }
    }

    public static Boolean verificator(String username, String password) {
        try {
            PreparedStatement prepare = connect.prepareStatement(
                "Select * from users where username='?'&&password='?'");

上記は私のコードフラグメントです。Connectionおよびオブジェクトを static と宣言してResultsetいるので、静的検証メソッドから呼び出すことができます。また、検証メソッドは静的に宣言されているため、className.verificator(param, param) を使用するだけで、別のクラスからクラス変数として呼び出すことができます。

クラスを単独でテストするとコンパイルおよび実行されますが、別のクラスから呼び出しが行われるたびに PerparedStatement 行で NullPointerException エラーが発生します。

なぜそれが起こっているのか誰か助けてくれませんか?

ありがとうございました

4

5 に答える 5

9

検証メソッドを静的として宣言したため、他のクラスからアクセスでき、検証メソッドは接続を使用していますが、これも静的です。

問題は、接続がオブジェクトのコンストラクターでのみ初期化されるため、コンストラクターが呼び出されない場合、connect が null になることです。

静的ブロックで接続変数を初期化するか、使用する前に null かどうかを確認する必要があります。

于 2012-08-03T13:18:06.307 に答える
2

javaでオブジェクトを静的に宣言できますか?

できますが、それは悪い考えです。

public static Boolean verificator(String username, String password) {
    try {
        synchronized(DATABASE_URL){
            if(connect==null){
                Class.forName(Driver);
                connect = DriverManager.getConnection(DATABASE_URL,DB_USERNAME, DB_PASSWORD);
            }
        }

        PreparedStatement prepare = connect.prepareStatement(
于 2012-08-11T08:48:29.803 に答える
1

NullPointerException変数を初期化していないため、 が得られます。次のようなものを試してください

public static ResultSet resultSet = new ResultSet();

または、変数にアクセスするに変数を初期化する関数を実行します。

于 2012-08-03T13:16:57.470 に答える
1

これは、Connectionオブジェクトがどこかで閉じられているか、(コンストラクターの呼び出しによって) 適切に初期化されていないことを意味します。Connectionやなどの静的リソースを使用しないことを強くお勧めResultSetします。むしろ、それらをインスタンスベースにして、静的メソッドからそのインスタンスを呼び出します。

于 2012-08-03T13:17:53.397 に答える
1

コンストラクターは、クラスのインスタンスが構築されるとき、つまりnewキーワードを使用するときに実行されます。コンストラクターのインスタンスを作成する前に静的connect変数を使用するとServerFunctions、実行されません。

クラスがロードされたときに実行される静的初期化ブロックを使用してこれを修正できます。

static{
    //code from your constructor here
}
于 2012-08-03T13:19:47.210 に答える