0

スイング イベント処理を使用してデータベース テーブル レコードにアクセスしようとしていますが、ボタンを押した後に例外が表示されます。何が悪いのかわかりません。ここに私のコードがあります:

private void DisplayAllButtonActionPerformed(java.awt.event.Act ionEvent evt) {

    try { 

        String SQL = "SELECT * FROM OCCUPANTS";
        rs = stmt.executeQuery( SQL ); //line no 264

        while( rs.next( )) {
            int id_col = rs.getInt("ID");
            String id=Integer.toString(id_col);
            String room =rs.getString("ROOM");
            String occupant = rs.getString("OCCUPANT");

            DisplayArea.setText( id + " " + room + " " + occupant);
        }
   } 
   catch ( SQLException err ) {
        System.out.println( err.getMessage( ) );
   }
}

休閑は例外です。

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at wumpus.WumpusGUI.DisplayAllButtonActionPerformed(W umpusGUI.java:264)
at wumpus.WumpusGUI.access$300(WumpusGUI.java:16)
at wumpus.WumpusGUI$4.actionPerformed(WumpusGUI.java: 164)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.jav a:6505)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3321)
at java.awt.Component.processEvent(Component.java:627 0)
at java.awt.Container.processEvent(Container.java:222 9)
at java.awt.Component.dispatchEventImpl(Component.jav a:4861)
at java.awt.Container.dispatchEventImpl(Container.jav a:2287)
at java.awt.Component.dispatchEvent(Component.java:46 87)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:4422)
at java.awt.Container.dispatchEventImpl(Container.jav a:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719 )
at java.awt.Component.dispatchEvent(Component.java:46 87)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.j ava:703)
at java.awt.EventQueue.access$000(EventQueue.java:102 )
at java.awt.EventQueue$3.run(EventQueue.java:662)
at java.awt.EventQueue$3.run(EventQueue.java:660)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPri vilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPri vilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:676)
at java.awt.EventQueue$4.run(EventQueue.java:674)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPri vilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 673)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:97)
BUILD SUCCESSFUL (total time: 28 seconds)

これがグローバルな初期化ですstmt

public class WumpusGUI extends javax.swing.JFrame {

    Connection con;
    Statement stmt;
    ResultSet rs;
    /**
     * Creates new form WumpusGUI
     */
    public WumpusGUI() {
        initComponents();
        DBConnect();
    }

    public void DBConnect() {
        try {
            String host = "jdbc:derby://localhost:1527/occupants";
            String uName = "ravi";
            String uPass= "ravi";
            Connection con = DriverManager.getConnection( host, uName, uPass );
            Statement stmt = con.createStatement();
        }  
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ありがとう。

4

4 に答える 4

5

が宣言されている場所を示していませんがstmt、おそらく null のようです。null 以外の値に設定されると予想していたのはどこですか?

これについての2つのポイント:

  • PreparedStatementクエリを実行するたびに別のを使用する必要があります
  • とにかくUIスレッドでデータベースアクセスを実行すべきではありません

(さらに、メソッド名は Java の命名規則に違反しています。)

編集:あなたのコメントから、あなたは持っています:

public class WumpusGUI ... {
    Statement stmt;

    public void DBConnect() {
        ...
        Statement stmt = con.createStatement();
        ...
    }
}

メソッドのその行は、新しいローカル変数を宣言しています。インスタンス変数に値を割り当てていないため、インスタンス変数は null のままです。

最小の「修正」は、その行を次のように変更することです。

stmt = con.createStatement();

...しかし、上で述べたように、それは正しい修正ではありません。理想的には、GUI クラスからこのデータベース コードをすべて取得する必要がありますが、少なくとも、実行するたびに新しいステートメントを作成する必要があります。(そして、finally ブロックで閉じます。)

編集:さらに、メソッドで例外が発生した場合は、それを出力して楽しく続行するだけです...したがって、stmt変数は引き続きnullになります。一般的にキャッチしないでください。また、実際に続行できない例外をキャッチしないでください。Exception

于 2012-08-01T09:49:29.193 に答える
2

非常に単純です:stmt初期化されていません。

于 2012-08-01T09:49:39.370 に答える
0

stamt 変数は null でグローバルに初期化されている可能性がありますが、接続から取得する必要がある値の割り当てに失敗した可能性があります。コードをチェックアウトします。

于 2012-08-01T09:56:05.423 に答える
0

DBConnect メソッドを呼び出して、それを使用する前に stmt 変数を初期化する必要があります。

于 2012-08-01T10:06:19.920 に答える