1

jdbcを使用してテキストフィールドからmySqlに値を挿入しようとしていますが、準備されたステートメントを閉じるときにnullポインターエラーが発生するという問題があります。これが私のコードです

 private Connection con;
 private Statement stm;
 private ResultSet rs;
 private PreparedStatement ps ;



public void dbConnect(){
    try{
        Class.forName("com.mysql.jdbc.Driver");
        this.con = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbTestDrive"
                + "", "root", "password");

    }
    catch(ClassNotFoundException ex){}
    catch(SQLException ex){}
}

 public boolean insert(Member member)throws SQLException{
    this.dbConnect();
    boolean success = false;
    String query = "INSERT INTO try VALUES(?, ?)";
            try {
        this.ps = this.con.prepareStatement(query);
        this.ps.setString(1, member.getMemberId());
        this.ps.setString(2, member.getFirstName());


       int rows = this.ps.executeUpdate();
        if(rows>0){
            success = true;
        }

    } catch (SQLException ex) {
        ex.printStackTrace();
        throw ex;
    } finally{
        this.ps.close(); // this is my line: 56 (im getting null pointer here)
        this.con.close();
    }

    return success;
}

スタックトレースは次のとおりです。

   Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at rtu.tomis.dao.MemberDao.insert(MemberDao.java:56)
at rtu.tomis.gui.AddMemberView.btnSaveActionPerformed(AddMemberView.java:993)
at rtu.tomis.gui.AddMemberView.access$800(AddMemberView.java:21)
at rtu.tomis.gui.AddMemberView$9.actionPerformed(AddMemberView.java:476)

助けてくれてありがとう

4

5 に答える 5

3

tryこの行の実行前または実行中に、ブロック内で例外が発生しています。

this.ps = this.con.prepareStatement(query);

catchブロックが例外を再スローした後、finallyブロックが実行されます。残念ながらpsisnullのため、別の例外が発生し、それがスローされて、元の例外が隠されます。

より防御的にコーディングし、そうでない場合にのみ閉じpscon、呼び出し自体が発生する可能性nullのある例外をキャッチする必要があります。close()これにより、 の本体によってスローされた例外を伝播できますtry

tryまた、 のブロックでスローされた例外を黙って無視するべきではありませんdbConnect()。例外があなたの問題の根本にあるのではないかと思います。

于 2012-12-20T04:39:23.857 に答える
2

次のようにコードを書く必要があります。

finally{
  if(ps != null)
        try{
            this.ps.close(); 
        }catch(Exception e){
            System.out.println("PreparedStatement close problem");
        }
  if(con != null)
        try{
            this.con.close();
        }catch(Exception e){
            System.out.println("Database Connection close problem");
        }
}

conこれにより、または のいずれかpsが何らかのエラーのために初期化されなかった場合に、ヌル ポインター例外が回避されます。

またthis、クラス変数と同じ名前のメソッドのローカル変数がないため、すべてのコードからキーワードを削除できます。したがって、あいまいさはありません。

于 2012-12-20T04:35:10.927 に答える
0

finally 句で null をチェックする必要があります

finally{
  if(ps != null)
        this.ps.close();
   //
}

ただし、根本的な問題は、接続を開いたときに発生する可能性があります。失敗すると、準備されたステートメントが初期化されません。

this.ps = this.con.prepareStatement(query);

つまり、呼び出す前にnull でないprepareStatementことを確認してください。conメソッドdbConnectを変更して例外を出力する必要があります。これは、問題の原因を解決するのに役立ちます。

 try{
        Class.forName("com.mysql.jdbc.Driver");
        this.con = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbTestDrive"
                + "", "root", "password");

    }
    catch(ClassNotFoundException ex){
     ex.printStackTrace();
    }
    catch(SQLException ex){
     ex.printStackTrace();
    }
于 2012-12-20T04:40:31.430 に答える
0

insert メソッドで Prepared Statement オブジェクトを取得しておらず、null で何かを呼び出すと、Null Pointer Exception が発生します。

于 2012-12-20T07:14:15.823 に答える
0

dbConnect() メソッドでスローされた例外があったと思います。そのため、jvm は、準備されたステートメントのインスタンス化を読み取​​る前に、finally を直接読み取ります。

于 2012-12-20T04:42:19.357 に答える