Warum funktioniert der Code nicht?
lima-city → Forum → Programmiersprachen → Java
angegebenen elementen
array
code
entsprechende tabelle
ergebnis
falsch code
host
import
log
not
private string
problem
programm
richtige anzahl
spalten
statement
string
swing
system
zeile
-
Hallo,
ich versuche ein Tabellenmodell zu erstellen, das bei Angabe von MySQLDaten die entsprechende Tabelle zaubert. Allerdings bekomme ich eine NUllPointerException in der Zeile:
this.data.add(rs.getObject(this.columnNames));
was ist falsch?
import lib.silix.basic.error.Error; import lib.silix.basic.log.Logger; import javax.swing.table.AbstractTableModel; import java.sql.*; import java.util.Vector; public class MySQLTableModel extends AbstractTableModel { private Error error; private Logger log; private String[] columnNames; private Vector[] data; private String host, user, password, database, table; private Connection con; private Statement stmt; private ResultSet rs; private ResultSetMetaData metadata; public MySQLTableModel() { this("localhost","root","", "mysql", "user"); } public MySQLTableModel(String host, String user, String password, String database, String table) { this.error = new Error(); this.log = new Logger(); this.log.log("Log created."); this.host = host; this.user = user; this.password = password; this.database = database; this.table = table; try { Class.forName("com.mysql.jdbc.Driver"); } catch(ClassNotFoundException cnfex) { error.error("MySQLTableModel", "MySQLDriver not found."); log.log("Error thrown because of a not found driver."); log.log(cnfex.getMessage()); log.log("Exit programm..."); System.exit(1); } try { this.con = DriverManager.getConnection("jdbc:mysql://"+host+"/"+database, user, password); this.stmt = con.createStatement(); } catch(SQLException sqlex) { error.error("MySQLTableModel", "Couldn't create connection or statement."); log.log("Couldn't create connection or statement."); log.log(sqlex.getMessage()); log.log("Exit programm..."); System.exit(1); } try { this.rs = stmt.executeQuery("SELECT * FROM "+table); this.metadata = this.rs.getMetaData(); this.columnNames = new String[this.metadata.getColumnCount()]; data = new Vector[this.metadata.getColumnCount()]; for(int i=0; i< this.metadata.getColumnCount(); i++) { this.columnNames[i] = this.metadata.getColumnLabel(i+1); } while (rs.next()) { for (int i = 0; i < this.metadata.getColumnCount(); i++) { this.data[i].add(rs.getObject(this.columnNames[i])); } } } catch(SQLException sqlex) { error.error("MySQLTableModel", "Couldn't get the result."); log.log("Couldn't get the resul.t"); log.log(sqlex.getMessage()); log.log("Exit programm..."); System.exit(1); } } public int getColumnCount() { return columnNames.length; } public int getRowCount() { return data.length; } @Override public String getColumnName(int col) { return columnNames[col]; } public Object getValueAt(int row, int col) { return data[col].elementAt(row); } }
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hab mich mal durchgequält.
Also, in Zeile 63 steht:
data = new Vector
Und in Zeile 71 dann glaub ich das auf was du dich beziehst:
this.data
Das hättest du vlt dazu schreiben sollen oben, dann wärs einfacher gewesen.
Problem: Du versuchst die Elemente im VEctor aufzurufen, wie in einem Array. Das geht aber nicht.
Entweder du wandelst den Vector in ein Array um, oder benutzt dessen Methoden.
Z.b. hier elementAt (i)
Probiers mal damit, bevor ich weiterdurchsuch. -
Nene, data is nen Vector-Array, von daher passt das schon...
Du machst aber ein Array auf, daß so groß ist wie dein Ergebnis Spalten hat. Willst Du kein Array, daß so groß ist, wie das Ergebnis Zeilen hat ? Und ein Vector im Array hält dann die Spalten...
// richtige Anzahl nehmen data = new Vector[rowcount]; for(int i=0; i< this.metadata.getColumnCount(); i++) { this.columnNames[i] = this.metadata.getColumnLabel(i+1); } while (rs.next()) { // neuen Vec aufmachen Vector tempvec = new Vector(); for (int i = 0; i < this.metadata.getColumnCount(); i++) { //this.data[i].add(rs.getObject(this.columnNames[i])); // zeug in Vec schmeissen tempvec.add(rs.getObject(this.columnNames[i])); // Vec zu Array adden this.data[rowzaehler] = tempvec; } }
Boah, kann man in diesem Eingabefeld besch***** editieren oder was ? Das wird wohl nix mit ordentlicher Einrückung...
P.S.: Die NullPointerException gibts, weil es noch keinen Vector in deinem Array gibt. Das Array wird nicht automatisch mit den angegebenen Elementen gefüllt, also neuen Vector aufmachen...
Beitrag geändert: 1.12.2008 12:08:43 von gcsdriver -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage