Problem mit Autoverwaltungsprogramm

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo an alle!

Ich programmier grad an einem Autoverwaltungsprogramm (is nur zum Spass um meine Fähigkeiten in Java zu erweitern *g*).

Hab nun folgendes Problem:
Wie aus der Klasse Datenbank.java zu erkenne ist, steuert sie das ein- und auslesen der "Datenbank" (eine Textdatei mit der Endung avd; momentan funktioniert nur das auslesen).
Momentan liest sie nur aus der vorhandenen Datei versuch.avd die Daten aus.

Code:
public class Datenbank {

    /** Liest die DB ein und speichert sie in einem Vektor */
    public Vector liesEin() {
        
        String line;
        Vector db = new Vector();

        try {
          LineNumberReader reader = new LineNumberReader(
                                      new FileReader( "C:\\versuch.avd") );
          while ( ( line = reader.readLine() ) != null ) {
          
          /* Wie ich die einzelnen Strings hohle:
           * ich bestimme die einzelnen Kategorien (Marke, Modell etc.), hohle mir deren Index (= Position, 
           * wo dieses Wort beginnt), zähle die Anzahl der Buchstaben plus den ":" hinzu (also 5 + 1 bei "Marke");
           * bin somit am Anfang des gewünschten Eintrages; lese diesen bis ";" (= markiert das Ende des Eintrages)
           * und speichere ihn in den Vektor db 
           */
              
             StringBuffer buffer = new StringBuffer(line);
             
             int markeIndex = buffer.indexOf("Marke:")+6;
             int modellIndex = buffer.indexOf("Modell:")+7;
             int bjIndex = buffer.indexOf("Baujahr:")+8;
             int psIndex = buffer.indexOf("PS:")+3;
             
             String marke = buffer.substring( (markeIndex),  buffer.indexOf(";", markeIndex) );
             String modell = buffer.substring( (modellIndex), buffer.indexOf(";", modellIndex) );
             String bj = buffer.substring( (bjIndex), (bjIndex+4) ); /*hier nicht wie oben da es nur 
                                                                      *4-stellige Jahreszahlen gibt */
             String ps = buffer.substring( (psIndex), buffer.indexOf(";", psIndex) );
             
             db.add(marke);
             db.add(modell);
             db.add(bj);
             db.add(ps);
          }
          
          reader.close();
        } 
        catch (IOException e) {
          System.out.println("\tFehler beim Lesen der Datei!\n");
          e.printStackTrace();
        }
        
        return db;
    }
}

In dem Fenster (Hauptfenster.java) erzeuge ich einen JTable und will nun, dass gleich am Start die Datenbak eingelsen und dargestellt wird.

Code:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class HauptFenster extends JFrame {    
    
    public static JTable liste;
    
    public static JButton eintragBearbeiten;
    public static JButton eintragLöschen;
    
	public HauptFenster() {
		Container cp = getContentPane();
		
		
		//die Liste zum Anzeigen der Einträge
		
		Vector spaltenNamen = new Vector();
            spaltenNamen.add("Marke");
            spaltenNamen.add("Modell");
            spaltenNamen.add("Baujahr");
            spaltenNamen.add("PS");
		
        
        Datenbank db = new Datenbank();
        Vector daten = db.liesEin();
        
			liste = new JTable(daten, spaltenNamen);
			
				liste.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
			
			JScrollPane sp = new JScrollPane(liste);
			
			cp.add(sp, BorderLayout.CENTER);
		
   usw.

Jetzt meine Frage: Warum bekomme ich diese Fehlermeldung, wenn ich es ausführe?

java.lang.ClassCastException
at javax.swing.table.DefaultTableModel.justifyRows(Unknown Source)
at javax.swing.table.DefaultTableModel.setDataVector(Unknown Source)
at javax.swing.table.DefaultTableModel.<init>(Unknown Source)
at javax.swing.JTable.<init>(Unknown Source)
at Ausprobiertes.AutoVerwaltung.HauptFenster.<init>(HauptFenster.java:53)
at Ausprobiertes.AutoVerwaltung.AutoVerwaltung$1.run(AutoVerwaltung.java:27)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)



Vielen Dank im Voraus
 
Anonymous hat gesagt.:
java.lang.ClassCastException
at javax.swing.table.DefaultTableModel.justifyRows(Unknown Source)
at javax.swing.table.DefaultTableModel.setDataVector(Unknown Source)
at javax.swing.table.DefaultTableModel.<init>(Unknown Source)
at javax.swing.JTable.<init>(Unknown Source)
at Ausprobiertes.AutoVerwaltung.HauptFenster.<init>(HauptFenster.java:53)
at Ausprobiertes.AutoVerwaltung.AutoVerwaltung$1.run(AutoVerwaltung.java:27)

da siehst du doch was für eine exception auftritt und wo sie auftritt.
hier: http://www.java-forum.org/de/viewtopic.php?t=3976
 
nein, nur weil die exception in einer methode des models auftritt, wurde sie doch indirekt durch die initialisierung der JTable eingeleitet. aber ohne (relevanten) code kann man so nix sagen
 
muss der datenvector nicht ein vector von vectoren sein ? (ohne Gewähr). d.h. jeder Eintrag im datenvector ist wieder ein vector, der die daten für die aktuelle Zeile hält....

dann wäre es zu erklören weil du nur Strings reinhaust .....
 
In Java gibt es ein Konzept, das sich Definite Assignment nennt. Gemeint ist damit die Tatsache, daß jede lokale Variable vor ihrer ersten Verwendung definitiv initialisiert sein muß. Das wünscht sich eigentlich zwar auch jeder Programmierer, aber in Java wird dies durch den Compiler sichergestellt! Dazu muß im Quelltext eine Datenflußanalyse durchgeführt werden, die jeden möglichen Ausführungspfad von der Deklaration einer Variablen bis zu ihrer Verwendung ermittelt und sicherstellt, daß kein Weg existiert, der eine Initialisierung auslassen würde.

Die folgende Methode Test läßt sich beispielsweise deshalb nicht fehlerfrei kompilieren, weil k vor der Ausgabeanweisung nicht initialisiert wird, wenn i kleiner 2 ist:

001 public static void Test(int i)
002 {
003 int k;
004 if (i >= 2) {
005 k = 5;
006 }
007 System.out.println(k);
008 }

dies habe ich aus dem onlinebuch "Handbuch der Javaprogrammierung" und versteh diesen fehler mit initialisieren nicht. kann mir das einer simpler erklären
 
Das bedeutet ganz einfach, daß du alle deine lokalen Variablen initialisieren mußt.
Code:
public static void Test(int i)
{
int k;
if (i >= 2) 
{
    k = 5; // wenn i >= 2 ist, wird k mit dem wert 5 initialisiert
}
// wenn k nicht >= 2 ist, ist k nicht initialisert worden und fuehrt zu einem Compiletimeerror
System.out.println(k);
}
Lösung:
Code:
public static void Test(int i)
{
int k = 0; // k initialisieren
if (i >= 2) 
{
    k = 5;
}
System.out.println(k);
}
 
hier wird als ergebnis
a == b liefert false und
a != b liefert true.
zeigen hier a und b nicht auf das selbe objekt und müsste somit genau das gegenteil anzeigen?


Code:
public class operat
{
  public static void main(String[] args)
  {
    String a = new String("hallo");
    String b = new String("hallo");
    System.out.println("a == b liefert " + (a == b));
    System.out.println("a != b liefert " + (a != b));
  }
}
[/code]
 
String a und b zeigen auf das selbe Objekt und sind equal.
Code:
String a = new String("hallo");
String b = a;

String a und b zeigen auf unterschiedliche Objekte und sind equal.
Code:
String a = new String("hallo");
String b = new String("hallo");
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben