PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] Dateiarbeit



pertze
11-06-2004, 13:56
Hallo allerseits,

ich fange gerade an mich mit Java zu beschäftigen und habe ein kleines Problem:

Ich möchte ganz einfach aus einer Textdatei jede Zeile in ein Array speichern und z.B. das 0. Feldelement in einem JTextPane ausgeben.

Ich habe eine Klasse für das DateiHandling:


public class QuizFile {

public String buffer[];
int i = 0;

public QuizFile() {
try
{
FileReader freader = new FileReader("questions.txt");
BufferedReader in = new BufferedReader(freader);

while (in.readLine() != null)
{
this.buffer[i] = in.readLine();
i++;
}
freader.close();
}
catch(Exception e) {}
}
}

Und einen Button, der bei Betätigung den Feldinhalt im JTextPane ausgeben soll:


final QuizFile myfile = new QuizFile();
...
jButtonNextQ.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jTextPaneQuestion.setText(myfile.buffer[0]);
}
});

Nur leider bekomme ich eine NullPointerException, wenn ich den Button drücke :\

Wenn ich einen SringBuffer verwende gehts, aber ich will die Zeilen in einen Array haben.

Hoffe mir kann jemand helfen.
Danke.

Gruß, pertze

peschmae
11-06-2004, 14:19
Bei Arrays musst du am Anfang sagen wie gross sie sein sollen.

Wenn du das - wie hier - nicht weisst, machst du zuerst eine ArrayList, der du alle Strings hinzufügst und konvertierst diese dann am Ende per .toArray() in ein String-Array.

Das Problem ist dass du mit
public String buffer[];
erst eine Referenz hast - die auf Null zeigt. Nirgendwohin. Der musst du zuerst etwas Speicher zuweisen, damit du dann Array spielen kannst:
buffer = new String[12];
(für 12 ArrayElemente)

MfG Peschmä

anda_skoa
11-06-2004, 14:28
Am besten du nimmst während des Leseprozesses einen ArrayList und fügts jede Zeile dort hinzu.

Abschliessend erzeugst du dann aus der ArrayList einen Array, dafür hat der Container eine Methode.

Ciao,
_

pertze
13-06-2004, 16:50
Hallo,

so, ich habe es mal mit der ArrayList versucht:


public class QuizFile {

private ArrayList alFile = new ArrayList();

public QuizFile() {
try {
FileReader freader = new FileReader("questions.txt");
BufferedReader in = new BufferedReader(freader);

while (in.readLine() != null)
{
alFile.add(in.readLine());
}
freader.close();
}
catch(Exception e) {}
}

public int getAlSize()
{
return this.alFile.size();
}
}

Aber wenn ich mir die Anzahl der Elemente in der ArrayList ausgeben lasse, erhalte ich immer 7 weniger als tatsächlich in der Datei enthalten sind.

Was hab ich hier falsch gemacht?

peschmae
13-06-2004, 19:48
mit


while (in.readLine() != null)
{
alFile.add(in.readLine());


liest du pro Schleifendurchgang gleich zwei Zeilen, speicherst aber nur eine in der Liste.

Lösung:


String s;
while ( (s = in.readLine()) != null)
alFile.add(s);


MfG Peschmä

pertze
13-06-2004, 21:42
Dankööö!

Sym
14-06-2004, 01:14
Original geschrieben von peschmae


String s;
while ( (s = in.readLine()) != null)
alFile.add(s);


MfG Peschmä

Hi,

ein wenig OT, aber hier sehe ich es wieder. Warum kann ich den String nicht in der Bedingung deklarieren?

peschmae
14-06-2004, 09:26
Das ist grundsätzlich nicht erlaubt. Der Grund ist, dass du schon beim zweiten Schleifendurchlauf eine zweite Referenz mit dem gleichen Namen hättest - beide heissen s. Das geht natürlich nicht.

Was genau dagegen spricht dass z.B. der Compiler automatisch das "String" beim zweiten Durchlauf rausschmeisst weiss ich nicht - aber es wäre wohl nicht sehr konsistent.

An der Stelle könnte man natürlich auch sehr gut eine for-Schleife verwenden - deren Initialisierungsblock wird auch nur einmal durchlaufen (aus genau dem Grund):


for (String s; (s = in.readLine()) != null; alFile.add(s)) {}

(ungetestet)

MfG Peschmä

Sym
14-06-2004, 12:13
Hi,

das mit der Konsistenz macht natürlich Sinn. Ich hätte nur gedacht, dass der GarbageCollector sich darum kümmern könnte (in dieser Situation). Dann wird manchmal der Code "schöner". Aber das ist wohl Ansichtssache.

peschmae
14-06-2004, 15:53
Das hat aber nichts mit der Garbage Collection zu tun. Die spielt hier überhaupt nicht - es werden ja keine Objekte nicht mehr verwendet.
Das einzige was du tust ist ein bisschen mit Referenzen spielen - und innerhalb eines "Scope" sollte es nicht mehrere male eine Referenz des gleichen Namens haben (in einem Unter-Bereich ist es hingegen möglich, eine Variable mit gleichem Namen zu haben wie im Bereich drumherum, aber im selben Bereich geht das nicht)

MfG Peschmä

Sym
14-06-2004, 16:34
Original geschrieben von peschmae
Das hat aber nichts mit der Garbage Collection zu tun. Die spielt hier überhaupt nicht - es werden ja keine Objekte nicht mehr verwendet.
Das einzige was du tust ist ein bisschen mit Referenzen spielen - und innerhalb eines "Scope" sollte es nicht mehrere male eine Referenz des gleichen Namens haben (in einem Unter-Bereich ist es hingegen möglich, eine Variable mit gleichem Namen zu haben wie im Bereich drumherum, aber im selben Bereich geht das nicht)

MfG Peschmä

Ok, das mit dem GC war Mist ;). Ich verstehe, was Du meinst. Und so schlimm ist das ganze ja nun auch nicht. ;)