PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : FileWriter, bzw. IOException Probleme | Java



maceop
31-10-2002, 18:17
hab ein problem mit FileWriter bzw. mit "throws IOException", hier erstmal ein Teil des Codes:



void write_into_file()
{
int array_counter;

File datei = new File("listd.txt");
FileWriter ausgabestrom = new FileWriter(datei);
PrintWriter ausgabe = new PrintWriter(ausgabestrom);

for(array_counter=0;array_counter < icount;array_counter++)
{
ausgabe.print(schuelerliste[array_counter].nachname);
ausgabe.print(schuelerliste[array_counter].vorname);
ausgabe.println();
}

ausgabe.close();
}


zur info: schuelerliste ist ein array von 100 elementen .

mein problem ist jetzt das folgende: ein beispielprog , das in eine file schrieb, hab ich versucht auf eine gui - anwendung zu "portieren", d.h. wenn der user nen bestimmten button drückt, wird write_into_file() aufgerufen :



class b_save implements ActionListener
{
public void actionPerformed (ActionEvent e)
{
write_into_file();
}
}


doch als fehler erhalte ich:

unreported exception java.io.IOException; must be caught or declared to be thrown

in dem ursprünglichen program (keine gui) wurde in main ein "throws IOException" hinzugefügt, doch wo soll ich das in diesem falle machen ? wenn ich an meine main-methode ein throws IOException anhänge, funktionierts immer noch nicht.

hoffe ihr könnt mir helfen...

tia
maceop

Lin728
31-10-2002, 18:26
Nein , du hast das falsch verstanden. Da bei File-Operationen leicht was scheif gehen kann, wirft diese Klasse im Fehlerfall eine exception, und so bricht das Programm nicht einfach ab, sondern überlässt dem Anwende die Fehlerbehandlung. Dies wird praktisch erzwungen...


das ganze geht ungefähr so:

void write_into_file()
{
int array_counter;

try{
File datei = new File("listd.txt");
FileWriter ausgabestrom = new FileWriter(datei);
PrintWriter ausgabe = new PrintWriter(ausgabestrom);

for(array_counter=0;array_counter < icount;array_counter++)
{
ausgabe.print(schuelerliste[array_counter].nachname);
ausgabe.print(schuelerliste[array_counter].vorname);
ausgabe.println();
}
}catch((Exception e){});

ausgabe.close();
}

Allerdings glaube ich, dass der Synthax von catch nicht stimmt, hab leider kein File zur hand, was das macht...
Würde mich freuen, wenn mich da wer ausbessern kann...

Mfg

maceop
31-10-2002, 18:42
klappt so weit, nur muss ich ausgabe.close() auch in try packen, da er ansonsten kein datei kennt....

Lin728
31-10-2002, 18:54
Puh, hätt ich nicht geglaubt, dass das so stimmt ;-)

Ach ja, das .close() hab ich übersehen, sorry....

Mfg

peschmae
01-11-2002, 07:38
oder du deklarierst die DAtei ausserhalb des Trys, die ist ja dann auf Try beschränkt, wenn du sie innerhalb deklarierst

allerdings wirft close() afaik auch eine IOException, also ist das so schon gut

MfG Peschmä

maceop
01-11-2002, 08:57
also danke erstmal.

es klappt aber eigentlich nicht so wie beabsichtigt. hier erstmal der aktuelle code



void write_into_file()
{
int array_counter;

File datei = new File("listd.txt");

try
{
FileWriter ausgabestrom = new FileWriter(datei);
PrintWriter ausgabe = new PrintWriter(ausgabestrom);

for(array_counter=0;array_counter < icount;array_counter++)
{
ausgabe.print(schuelerliste[array_counter].nachname + " ");
ausgabe.print(schuelerliste[array_counter].vorname);
ausgabe.println();
ausgabe.close();
}
}catch(IOException ioexcept)
{
System.out.println("no");
}

}


egal wieviele elemente schuelerliste (ok eins muss es schon haben) hat, es wird immer nur das erste in der datei listd.txt angezeigt.

schuelerliste[0].nachname == Günther
schuelerliste[0].vorname == Schmitz
schuelerliste[1].nachname == Dieter
schuelerliste[1].vorname == Meier
schuelerliste[2].nachname == Hans-Dieter
schuelerliste[2].vorname == Schröder

nun sollte ja eigentlich das folgende drinstehen

Günther Schmitz
Dieter Meier
Hans-Dieter Schröder

danach steht aber nur :

Günther Schmitz

in listd.txt

wisst ihr wo da das prob liegt ?

tia
maceop


ps. an icount liegts nicht

peschmae
01-11-2002, 11:16
das close muss aus der for - schleife raus

wie willst du in eine schon geschlossene Datei noch schreiben? ;-)

MfG Peschmä

maceop
01-11-2002, 11:31
solche dumme fehler zu finden kann manchmal echt schwer sein ;)

danke schön für eure hilfreichen verbessserungen !

fs111
01-11-2002, 13:13
Vielleicht solltest Du auch noch jeweils einen Carriage return mit \n ans Ende einfügen, dann steht in jeder Zeile nur ein Eintrag und das Auslesen ist dann auch einfacher.

fs111

maceop
01-11-2002, 13:31
danke für den Tipp, aber es ist so gedacht das vorname und nachname in einer zeile stehen, in jeder zeile ein "Eintrag" (besteht eben aus vor und nachname)

maceop

peschmae
01-11-2002, 14:10
und nachher hat er ja ein Println (was einem \n entspricht)

MfG Peschmä

maceop
01-11-2002, 22:48
das ganze gehört jetzt nur noch zum Themenkomplex FileHandling, doch möchte ich jetzt nicht extra nen thread eröffnen.

mit BufferedReader und readLine() les ich ne zeile aus meiner listd.txt ein, so dass z.B. der String zeile "Günther Schmitz" enthält. Nun will ich erreichen, das einem anderen string vname "Günther" zugewiesen und einem String nname "Schmitz" zugewiesen wird.

also line enthält die eingelesene zeile.

first_pos = line.indexOf(" ");
vname = line.substring(0,first_pos);

Danach enthält vname wie gewollt "Günther", doch der versuch das ganze bei Schmitz durchzusetzen.....schlägt irgendwie fehl. ich würde ja gerne einfach substring(first_pos + 1,x) machen, doch was ist in dem fall x ?

bis jetzt hab ich versucht das ganze so zu umgehen:

newpos = divide_string + 1;
pos = line.indexOf(" ",newpos);

doch hier ist pos == -1....

zusammenfassung:
ich hab ne zeile in nem string gespeichert, jetzt will ich vname das erste wort (also den Vornamen) und nname das zweite wort (also den Nachnamen) zuweisen....


es scheint fast, als wäre es besser nur println anstatt print zu verwenden und alles untereinander zu schreiben....

maceop

anda_skoa
02-11-2002, 12:30
Original geschrieben von maceop

Danach enthält vname wie gewollt "Günther", doch der versuch das ganze bei Schmitz durchzusetzen.....schlägt irgendwie fehl. ich würde ja gerne einfach substring(first_pos + 1,x) machen, doch was ist in dem fall x ?


Ich glaube das zweite Argument ist immer die Endposition, bzw eins davor.
In diesem Fall wäre es dann die Länge des Strings


Ich würde aber vorschlagen, das ganze mit einem StringTokenizer zu machen.

Ciao,
_