2012-08-01 74 views
0

我正在嘗試使用擺動事件處理來訪問數據庫表記錄,但按下按鈕後它顯示異常。我不知道什麼是錯的。這裏是我的代碼:我不能解決這個「NullPointerException」

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(); 
     } 
    } 
} 

感謝的全球初始化。

+0

什麼是「stmt」和聲明/初始化位置? – JTMon 2012-08-01 09:50:57

+0

我現在編輯了代碼。 – 2012-08-01 09:59:43

+0

你能在WumpusGUI.java中顯示第264行嗎? – 2012-08-01 10:30:24

回答

5

那麼,你沒有顯示哪裏stmt正在宣佈,但它聽起來像它可能爲空。你在哪裏期待它被設置爲非空值?

這個

兩點:

  • 你應該使用一個單獨的PreparedStatement每次執行一個查詢
  • 你不應該在UI線程要執行數據庫訪問反正

被(此外,您的方法名稱違反了Java命名約定。)

編輯:從您的意見,你有:

public class WumpusGUI ... { 
    Statement stmt; 

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

你的方式,該行宣佈了新的本地變量 - 它不分配一個值到實例變量,所以實例變量保持爲空。

最小的「修復」將改變該行只是:

stmt = con.createStatement(); 

...但正如我上面所說,那會不會是正確修復。理想情況下,您應該首先獲得這個數據庫代碼的所有以外的GUI類,但是至少您應該在每次要執行它時創建一個新語句。 (然後關閉它在finally塊)。

編輯:另外,如果你在該方法的例外,你只是打印出來,並繼續歡快地...所以你stmt變量將仍然是空值。 不要一般捕獲Exception不要捕獲你以後無法繼續的異常。

+0

我已全局聲明'stmt':'public class WumpusGUI extends javax.swing.JFrame { Connection con; 聲明stmt; ResultSet rs; *)創建新表格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(); }' – 2012-08-01 09:52:10

+0

@raviahuja請不要在評論中發佈代碼。編輯您的問題並添加此代碼。 – Baz 2012-08-01 09:53:31

+0

@raviahuja:請參閱我的編輯。 – 2012-08-01 10:00:02

2

很簡單:stmt尚未初始化。

0

您的stamt變量可能已全局初始化爲null,但是您將無法分配必須從連接中獲取的值。檢出你的代碼。

0

您必須調用DBConnect方法來初始化使用它的stmt變量beofre。