2012-10-28 47 views
1

我的應用程序拋出NullPointerException。我創建了MySQL數據庫和我的第二個類之間的連接。將ResultSet添加到Jtable中(兩個類之間)

我無法通過我的第二課中的方法調用DefaultTableModel。 我該如何解決這個問題?

public class MySQL extends javax.swing.JFrame { 
    private DefaultTableModel modelTabeli; 

    public MySQL(){ 
     initComponents(); 
     BazaDana bd = new BazaDana(); 

     try{ 
      modelTabeli = bd.map(); 
      jTable1.setModel(modelTabeli); 
     } 
     catch(Exception e){ 
      System.out.println(e.toString()); 
     } 
    } 

    public static void main(String args[]) throws Exception{ 
     BazaDana bd = new BazaDana(); 
     bd.readDataBase(); 
    } 
} 

二等

import java.sql.*; 
import javax.swing.table.DefaultTableModel; 

public class BazaDana{  
    public DefaultTableModel map() throws SQLException 
    { 
     defaultTableModel = new DefaultTableModel(); 
     int numberOfColumns = resultSetMetaData.getColumnCount(); 
     while (resultSet.next()) 
     { 
      Object [] rowData = new Object[numberOfColumns]; 
      for (int i = 0; i < rowData.length; ++i) 
      { 
       rowData[i] = resultSet.getObject(i+1); 
      } 
      defaultTableModel.addRow(rowData); 
     } 
     return defaultTableModel; 
    } 
} 
+3

請縮短您的程序以儘可能縮短展示時間 你的問題。並適當地縮進你的代碼。 – Keppil

+2

發佈[SSCCE](http://sscce.org)。正確縮進代碼。如果某處發生錯誤,請在代碼中顯示註釋。這裏的人不是瘋狂的猜測大師! –

+0

還發布NullPointerException的堆棧跟蹤。作爲一個附註:catch(Exception e){throw e;}是毫無意義和不必要的;和BazaDana.close()應該嵌套try-finally,否則在關閉resultSet /語句時引發的異常將阻止語句/連接被關閉。 – ignis

回答

2

好吧,我可以給你一個替代解決方案,如果你的目標是GUI類從類查詢數據庫分開。不要返回的DefaultTableModel,返回結果集從剛值通過一些集合,像這樣:

創建MySQL GUI類:

import java.awt.EventQueue; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 


public class MySql extends JFrame{ 
    JTable table = new JTable(); 
    DefaultTableModel model = new DefaultTableModel(new Object[][]{},new String[]{"First column","Second column"}); 

    public MySql(){ 
     table.setModel(model); 
     add(new JScrollPane(table)); 

     //Populate table 
     BazaDana bd = new BazaDana(); 
     List<Value> values = bd.selectAll(); 
     for(Value v : values){ 
      model.addRow(new Object[]{v.getFirstValue(),v.getSecondValue()}); 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable(){ 
      public void run() { 
       MySql ms = new MySql(); 
       ms.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       ms.pack(); 
       ms.setVisible(true); 
      }}); 
    } 
} 

然後創建Java bean類:

public class Value { 
    private int id; 
    private String firstValue; 
    private String secondValue; 

    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getFirstValue() { 
     return firstValue; 
    } 
    public void setFirstValue(String firstValue) { 
     this.firstValue = firstValue; 
    } 
    public String getSecondValue() { 
     return secondValue; 
    } 
    public void setSecondValue(String secondValue) { 
     this.secondValue = secondValue; 
    } 
} 

最後你查詢數據庫的BazaDana類:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.ArrayList; 
import java.util.List; 

public class BazaDana { 

    public List<Value> selectAll(){ 
     Connection conn = null; 
     Statement st = null; 
     ResultSet rs = null; 
     //Create list of values 
     List<Value> values = new ArrayList<Value>(); 

     try{ 
      Class.forName("com.mysql.Driver"); 
      conn =  DriverManager.getConnection("jdbc:mysql://localhost:3306/nameofdb","user","pass"); 
      st = conn.createStatement(); 
      rs = st.executeQuery("SELECT * FROM mytable"); 

      while(rs.next()){ 
       Value v = new Value(); 
       v.setFirstValue(rs.getString("first_column")); 
       v.setSecondValue(rs.getString("second_column")); 
       values.add(v); 
      } 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
     finally{ 
      try { 
       rs.close(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
      try { 
       st.close(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 

      try { 
       conn.close(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 

     } 
     return values; 
    } 
}