Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
O.K., aber ich stell' nur den Teil hinein, der auch etwas macht ( das ist nämlich noch Code für ein paar Methoden, die stehen aber außen und werden noch nicht benutzt ). Um da mal ein paar Sachen zu klären: ich habe ein Programm, das heißt KSP und das hat einen Ordner, der "Parts" heißt. dort wiederum sind einzelne Bauteile als Ordner dargestellt, in denen sich die "part.cfg"-Datei befindet. Man kann damit übrigens Raketen zusammenbauen und in den Weltraum schießen, aber ich komme vom Thema ab...
Java:
public class Rechner {
public static void main(String[] args) {
Console cons = System.console();
//Testen, ob min. ein Argument gibt; wenn ja, dann Kommandos ausführen
if(args.length>=1) {
String[] kommandos = new String[2];
kommandos[0] = "--h";
kommandos[1] = "-p";
if(args[0].equals(kommandos[0])) {
cons.printf(" java Rechner [--h, -p]%n%n --h: help%n -p: preferences;%n%n");
}
else if(args[0].equals(kommandos[1])) {
try {
File loeschen = new File("pfad.txt");
if(loeschen.delete() == true) cons.printf(" Einstellungen erfolgreich zurückgesetzt!%n%n");
else cons.printf(" Die Datei konnte leider nicht gelöscht werden!%n");
}
catch(Exception e) {
System.err.println(e);
}
}
}
Scanner sc = new Scanner(System.console().reader());
//Pfad eingeben und testen; in Datei eintragen
try {
File test = new File("pfad.txt");
if(test.isFile() == false) {
try {
cons.printf(" Bitte geben Sie den Pfad zum Parts - Verzeichnis des Kerbal Space Program im Verhältnis zu dieser Datei an! Bitte keinen Schrägstrich am Ende setzen!%n");
String pfad = sc.nextLine();
File test2 = new File(pfad);
if((test2.isDirectory() == true) && test2.getName().equals("Parts")) {
FileWriter schreiben = new FileWriter(test);
schreiben.write(pfad);
schreiben.close();
}
else if(pfad.equals("exit")) return;
else cons.printf("Das Verzeichnis konnte leider nicht gefunden werden bzw. hieß nicht \"Parts\".%n%n");
}
catch(Exception e) {
System.err.println(e);
}
}
}
catch(Exception e) {
System.err.println(e);
return;
}
//zweiter Teil: Das Öffnen der Pfad-Datei und das anschließende herraussuchen der Daten
try {
//Auslesen der Pfad-Datei
FileReader pfadstream = new FileReader("pfad.txt");
StringBuilder pfadspeicher = new StringBuilder(5000);
int gelesen;
boolean ende = false;
while(!ende) {
gelesen = pfadstream.read();
if(gelesen == -1) ende = true;
else pfadspeicher.append((char) gelesen);
}
pfadstream.close();
//Daten verarbeiten:
String pfaddata = pfadspeicher.toString();
File PartsDir = new File(pfaddata);
String[] Parts = PartsDir.list();
gelesen = 0;
ende = false;
File[] Partlist1 = new File[Parts.length];
File[] Partlist2 = new File[Parts.length];
int anzahl = 0;
int i;
//Einträge zählen, die Ordner sind und eine part.cfg-Datei haben
for(i=0;i < Parts.length;i++) {
Partlist1[i] = new File(Parts[i]);
Partlist2[i] = new File(Parts[i] + "/parts.cfg");
if(Partlist1[i].isDirectory() || Partlist2[i].exists() == false) continue;
anzahl++;
}
//part.cfg aufschreiben
File[] Partlist3 = new File[anzahl];
anzahl = 0;
for(i=0;i < Parts.length;i++) {
if(Partlist1[i].isDirectory() || Partlist2[i].exists() == false) continue;
Partlist3[anzahl]=new File(Partlist2[i]);
anzahl++;
}
FileReader[] Partlist4 = new FileReader[anzahl];
StringBuilder[] partdata = new StringBuilder[anzahl];
for(i = 0;i<anzahl;i++) {
partdata[i] = new StringBuilder(7500);
while(!ende) {
Partlist4[i] = new FileReader(Partlist3[i]);
gelesen = Partlist4[i].read();
if(gelesen == -1) ende = true;
else partdata[i].append((char) gelesen);
}
Partlist4[i].close();
}
}
catch (Exception e) {
System.err.println(e);
}
}
}
Dankeschön! Also, ich glaube ich müsste dann die .toString() Methode von File verwenden, oder?
EDIT: Ach quatsch, du hast ja recht. wenn ich das schon vorhandene Objekt nehme, muss ich nicht eine Methode ausführen und dann ein völlig neues Objekt erstellen.
Hm. Anscheinend gibt es da noch einen kleinen Denkfehler von mir, nicht in der Syntax. Das Programm zeigt nämlich, wenn ich es ausführe, "ArrayIndexOutOfBoundsException: 1" an. Und ich finde keinen Fehler! Ich habe zwar ein paar Sachen schon korrigiert (nämlich das die Datei part.cfg heißt und nicht parts.cfg), aber ich werde mir da mal alle Werte anzeigen lassen müssen...
Ich hab dir doch schon mal gesagt, dass du bitte den gesamten StackTrace inklusive Zeilennummern usw posten sollst. Das erleichtert die Fehlersuche immens.
Dein Fehler deutet darauf hin, dass du irgenwo auf den Index 1 (also das zweite Element) deines Arrays zugreifen willst, obwohl es gar nicht so viele Einträge gibt. Wo und warum das nun passiert mag ich gerade wirklich nicht raussuchen, bis du eine gescheite Fehlermeldung gepostet hast ...
Ja, ich bin schlimm, nicht? Nein, jetzt mal ehrlich. Das Problem ist ja genau das gerade.
Code:
java.lang.ArrayIndexOutOfBoundsException: 1
ist ja das, was beim Ausführen der Datei da steht. Das steht leider keine Zeilennummer. Deswegen unterteile ich den zweiten Teil des Programms jetzt in try-catch-Blöcke, um zu sehen welcher Array gemeint ist.
Edit: Das mit dem Unterteilen war ne echt bescheuerte Idee. jetzt bekomme ich 52 Errors beim Kompilieren. Na ja, was solls. dann mach ich das wieder weg. Ich benutze die e.printStackTrace() Methode.
Gesagt, getan. Einziges Problem: ich lasse mir das ERSTE Feld eines Array anzeigen und in dieser Zeile kommt natürlich auch der Fehler. Ich lasse mir am besten alle Arrays anzeigen um zu gucken, wo der Fehler liegt (und welche Array Felder enthalten). Das ging doch mit dem final-Block, oder?
java.lang.ArrayIndexOutOfBoundsException: 0
at Rechner.main(Rechner.java:172)
Um euch das Lesen etwas zu erleichtern: im hier stehenden Code wäre es Zeile 101.
Ich habe die Datei mit vim im Terminal erstellt und benutze jetzt Smultron (ein Texteditor) zu Bearbeiten. Zur Ausführbaren Datei komme ich mit dem Befehl "javac" und dann "java".
ich würde ein paar Ausgaben einbauen, um zu sehen, ob sinnvolle Werte in Variablen drinstehen.
zum Beispiel
Java:
String[] Parts = PartsDir.list();
for (String string : Parts) {
System.out.println(string);
}
[OT]Daher auch meine Frage zu deiner Werkzeugbox. In einer IDE, z.B. Eclipse, kann man sehr schön debuggen und das Programm Schritt für Schritt ausführen und sich die Variablen anzeigen lassen.[/OT]
Durch die Auflistung von "Parts" wurde mir das bewusst, denn einen Ordner irgendwas/part.cfg gibt es nicht. Deshalb muss der korrigierte Code so lauten:
Java:
Partlist1[i] = new File(pfadspeicher.toString() + "/" + Parts[i] + "/part.cfg");
Würde ich jetzt jedenfalls sagen. Ich kompilier' es mal schnell...
EDIT: Funktioniert super! Danke, auch wenn nur für die Idee mit dem Testen... Find ich ganz Prima!!!:applaus:
Der Schein trügt... ich habe nun also nur das erste Partdata-feld ausgeben lassen. Ich habe jetzt nochmal getestet, und das Ergebnis war: nur das erste Feld ist belegt, der Rest ist leer. Ich kann mir das nicht erklären! Der Fehler liegt übrigens in der 81. - 87. Zeile, denn Partdata[>0] ist leer. Das habe ich mit System.out.println() herausgefunden (Methode:
Code:
System.out.println(Partdata2[2].toString());
und ähnliche Sachen). Partlist1[], Parts[] sind anscheinen ganz normal.
Diesen Code verstehe ich auch nicht (wie so vieles in deinem Programm)
Was soll denn deiner Meinung nach in Partlist1, 2 3 nach deinen ganzen Aktionen drinstehen?
Vielleicht ist ja ein Ansatz ein Programm zu schreiben, das als Ausgangspunkt genau diesen Zustand hat?
Java:
...
File[] Partlist1 = new File[] {
new File("Datei1"),
new File("/pfad/Datei2") };
File[] Partlist2 = new File[] {
new File("Datei3"),
new File("/pfad/Datei4") };
File[] Partlist3 = new File[] {
new File("Datei5"),
new File("/pfad/Datei6") };
...
In Partlist1 stehen die möglichen part.cfg-Dateien. In Partlist2 stehen die vorhandenen part.cfg-Dateien. In Partlist3 stehen auch die vorhandenen part.cfg's, aber eben als FileReader.
Code:
File Partlist2 = new File[anzahl];
deklariert Partlist2.
Code:
for(i=0;i<Partlist1.length;i++) {
ist das gleiche wie
Code:
for(File list1 : Partlist1) {
(könnte ich eigentlich mal ändern...)
Code:
if(Partlist1.exists() == false) continue;
sortiert alle nicht - existierenden Dateien aus (continue sorgt doch dafür, dass die Schleife von vorne , also ein neuer Schleifendurchlauf, beginnt, oder?).
Code:
Partlist2[anzahl]=Partlist1[i]
beschreibt Partlist2 mit den existierenden dateien.
Merke: Ich schreibe die Datei jetzt so um, dass die for-Schleifen besser zu begreifen sind und benutze nun weniger Arrays, dafür aber Listen, da man dort nicht angeben muss, wie viele Elemente vorhanden sind.
public class Rechner {
public static void main(String[] args) {
Console cons = System.console();
//Testen, ob min. ein Argument gibt; wenn ja, dann Kommandos ausführen
if(args.length>=1) {
String[] kommandos = new String[2];
kommandos[0] = "--h";
kommandos[1] = "-p";
if(args[0].equals(kommandos[0])) {
cons.printf(" java Rechner [--h, -p]%n%n --h: help;%n -p: preferences;%n%n");
}
else if(args[0].equals(kommandos[1])) {
try {
File loeschen = new File("pfad.txt");
if(loeschen.delete() == true) cons.printf(" Einstellungen erfolgreich zurückgesetzt!%n%n");
else cons.printf(" Die Datei konnte leider nicht gelöscht werden!%n");
}
catch(Exception e) {
System.err.println(e);
}
}
}
Scanner sc = new Scanner(System.console().reader());
//Pfad eingeben und testen; in Datei eintragen
try {
File test = new File("pfad.txt");
if(test.isFile() == false) {
try {
cons.printf(" Bitte geben Sie den Pfad zum Parts - Verzeichnis des Kerbal Space Program im Verhältnis zu dieser Datei an! Bitte keinen Schrägstrich am Ende setzen!%n");
String pfad = sc.nextLine();
File test2 = new File(pfad);
if((test2.isDirectory() == true) && test2.getName().equals("Parts")) {
FileWriter schreiben = new FileWriter(test);
schreiben.write(pfad);
schreiben.close();
}
else if(pfad.equals("exit")) return;
else cons.printf("Das Verzeichnis konnte leider nicht gefunden werden bzw. hieß nicht \"Parts\".%n%n");
}
catch(Exception e) {
System.err.println(e);
}
}
}
catch(Exception e) {
System.err.println(e);
return;
}
//zweiter Teil: Das Öffnen der Pfad-Datei und das anschließende herraussuchen der Daten
LinkedList<File> Partlist1 = new LinkedList<File>();
LinkedList<FileReader> Partlist2 = new LinkedList<FileReader>();
LinkedList<StringBuilder> Partlist3 = new LinkedList<StringBuilder>();
try {
//Auslesen der Pfad-Datei
FileReader pfadstream = new FileReader("pfad.txt");
StringBuilder pfadspeicher = new StringBuilder(500);
int gelesen;
boolean ende = false;
while(!ende) {
gelesen = pfadstream.read();
if(gelesen == -1) ende = true;
else pfadspeicher.append((char) gelesen);
}
pfadstream.close();
//Daten verarbeiten
File PartsDir = new File(pfadspeicher.toString());
if(PartsDir.exists() == false) {
cons.printf("Ein Fehler ist aufgetreten! Das Programm wird beendet!%nMögliche Fehlerquellen: -Das Programm wurde verschoben%n/t-Die Pfad.txt wurde bearbeitet");
return;
}
String[] Parts = PartsDir.list();
gelesen = 0;
ende = false;
int i;
//Einträge zählen, die Ordner sind und eine part.cfg-Datei haben und aufschreiben
for(i=0; i<Parts.length;i++) {
File aktuell = new File(pfadspeicher + "/" + Parts[i] + "/part.cfg");
if(aktuell.exists() == false) continue;
Partlist1.add(aktuell);
}
for(i = 0;i<Partlist1.size();i++) {
FileReader pa_fr = new FileReader(Partlist2.get(i).toString());
Partlist2.add(pa_fr);
StringBuilder pa_sb = new StringBuilder(7500);
Partlist3.add(pa_sb);
while(!ende) {
gelesen = Partlist2.get(i).read();
if(gelesen == -1) ende = true;
else Partlist3.get(i).append((char) gelesen);
}
Partlist2.get(i).close();
}
System.out.println(Partlist3.get(3));
}
catch (Exception e) {
e.printStackTrace();
}
}
}
Und die jetzige Fehlermeldung:
Code:
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.LinkedList.entry(LinkedList.java:365)
at java.util.LinkedList.get(LinkedList.java:315)
at Rechner.main(Rechner.java:146)
Tipp: immer minus 62 rechnen, weil so groß der Teil mit den nicht genutzten Klassen ist.
Der Quellcode passt nicht zur Fehlermeldung. Es gibt keine Zeile 146 und ich echt keine Lust habe zu rechnen und der Meinung bin, das ist Deine Aufgabeueh:
Aber, wenn ich mir das so ansehe, mechst du Partlist2.get(i) aber in Partlist2 wurde nie was hinzugefügt.
Ich weiiss, ich nerve manchmal, aber es gibt Code-Konventionen, damit andere, wir, leichter sich in Code einlesen können. Hier mal ein paar Hinweise
Klassen-Namen beginnem mit einem Grossbuchstaben, Variablen mit einem Kleinbuchstaben.
Man sollte immer gegen ein Interface programmieren, also
Code:
List<FileReader> Partlist2 = new LinkedList<FileReader>();
oder vielleicht
Code:
List<FileReader> Partlist2 = new ArrayList<FileReader>();
Das Iterieren über eine Liste/Array geht einfacher mit der neuen foreach-Schleife
Code:
for (String string : Parts)
Das kannst Du häufig anwenden.
Exception gibt man üblicherweise so aus
Code:
e.printStackTrace();
Ich muss anmerken, dass ich langsam müde werde dir in diesem Thread weiter zu helfen, da ich keine Bereitschaft sehe, dass du dich in dem Problem richtig vertiefst. Anscheinend ist es dir zu mühsam einen Fehler selber zu suchen, obwohl ich (wir) vielfältige Hinweise gegeben haben. Andererseits stoppst du jede Eigeninitiative und postet jedes Problemchen/Exception sofort hier und erwartest Hilfe.
Du greifst auf das i-te Element von Partlist2 zu, aber da steht ja momentan noch überhaupt nichts drin, da du bisher nur in Partlist1 Elemente hinzugefügt hast.
Ja, da hast du Recht. trotzdem bleibt der Bildschirm leer... sehr traurig. Es sieht zwar so aus, als hätte ich etwas falsches von wegen Dateiname hingeschrieben, das ist aber alles richtig...
Damit die Fehlermeldung nicht verfälscht wird? :autsch:
Code:
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.LinkedList.entry(LinkedList.java:303)
at java.util.LinkedList.get(LinkedList.java:253)
at Rechner.main(Rechner.java:84)
Du greifst auf das erste Element von Partlist2 zu (jenes mit Index 0). Die Liste ist aber LEER, also knallt es.
Die 62 darfst du übrigens wirklich nur bei der Meldung in deiner eigenen Klasse abziehen Die Fehlermeldung müsste eigentlich so lauten:
Code:
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.LinkedList.entry(LinkedList.java:365)
at java.util.LinkedList.get(LinkedList.java:315)
at Rechner.main(Rechner.java:84)
korrekt, dann muss keiner rechnen!
[JAVA=127]
for(i=0;i<10;i++) {
//Das ist Zeile 128
}
[/code]
Dann kann man dir helfen.
Es gibt kaum einen Post von dir, in dem Fehler und Code zusammenpassen!
Wenn du gleichviel Zeilen
Code:
System.out.println(...)
in deinen Code investieren würdest, wie hier Pots im Forum, müsstest du wohl bald daufkommen was logisch nicht passt.
Es liegt ja nur an der Logik, nicht an der Syntax!
O.K., ich habe jetzt wirklich mehr System.out.println() Methoden benutzt. Ich vermutete, dass es folgende Zeile sein würde:
[JAVA=128]File aktuell = new File(pfadspeicher.toString() + "/" + Parts + "/part.cfg");[/code]
aber das Problem liegt wohl doch eher beim Ausgeben der Daten.
Sachen, die NICHT funktionierten (in Zeile 128):
- StringBuilder zu String
- das, was in Klammern steht, erst als String deklaieren
Ich bin dem Programmablauf mal gefolgt: beim ersten Schleifendurchlauf kommt ein Element, das es nicht gibt. Dieses wird aussortiert und die Schleife wird durch den Befehl continue; von neuem begonnen. Das zweite Element gibt es, und es wird auch als richtig gewertet. Es wird erfolgreich geaddet, aber beim Ausgeben taucht dann ein Fehler auf. Dann kommt die Fehlermeldung, die schon oben genannt wurde. Die Liste hat nach der Fehlermeldung keinen Eintrag an dieser Index-Stelle, dabei habe ich doch kurz davor einen angehängt! Hier nochmal die Schleife der Geschehnisse:
Ich hab jetzt nicht alle Posts und den ganzen Code gelesen, aber ein IndexOutOfBoundsException erstaunt mich hier nicht:
Wenn du manche
Code:
i
überspringst, kannst du natürlich auch nicht auf alle
Code:
i
zugreifen!
Z.B.: Dein Parts hat 10 Einträge (0 bis 9) , angenommen 3 werden nicht geaddet (sondern mit continue übersprungen)
also gibts in partList nur 7 Teile (0 bis 6) => logisch dass get(7) , 8 und 9 nicht funktionieren können.
PS: Schreib einiges um: (außerdem gehören parts[] und partList1 klein geschrieben )
[JAVA=307]
for(String partarts) {
File aktuell = new File(pfadspeicher.toString() + "/" + part + "/part.cfg");
System.out.println(aktuell.toString());
if( ! aktuell.exists()) {
System.out.println("falsch");
continue;
} else {
System.out.println("richtig");
}
if(partList1.add(aktuell)) }
System.out.println("erfolgreich");
}
System.out.println(aktuell.toString());
}
[/code]
Ich dachte mal wieder, es wäre alles gut. Und warum? weil ich den Status des Dokuments immer wieder angegeben habe, also war das Ergebnis ungefähr das:
/
//
//
// T
// Te
// Tex
// Text
, was dann so aussah, als ob alle Dateien angegeben würden. Manchmal fall ich aber auch leicht auf solche Sachen rein...
Wieder einmal werden alle die Pfade aller Segmente korrekt eingelesen, auch als solche erkannt, aber diesmal liegt der Fehler im Einlesen.
Diesmal habe ich übrigens die Zählvariable i benutzt, weil ich sie, wie man sehen kann, oft benutze. Den Fehler habe ich jetzt auch gefunden. Er ist einfach wie genial: ende bleibt einfach auf true gesetzt, dabei muss ende am Anfang der Schleife immer wieder auf false gesetzt werden.
Und warum? weil ich den Status des Dokuments immer wieder angegeben habe, also war das Ergebnis ungefähr das:
/
//
//
// T
// Te
, was dann so aussah, als ob alle Dateien angegeben würden.
meinst?
Woher sollen wir wissen, wie die Ausgabe aussehen soll wenn wir die AnfangsDaten nocht kennen?
Woher sollen wir wissen, was davon nun richtig, und was falsch ist?
Wieder einmal werden alle die Pfade aller Segmente korrekt eingelesen, auch als solche erkannt, aber diesmal liegt der Fehler im Einlesen.
Das ist mal ne tolle Begründung.
Ziemlich beratungsresistent! Wenn du was mit
Code:
i
arbeitest, dann handelst du dir immer Probleme ein, wenn du damit unterschiedliche Array/Listen ansprichst!
Und: brauchst du deine Hilfs-Listen?
Variablen sollen möglichst kleine "Sichtbarkeit" haben!
Schmeiß als erstes dein globales
Code:
int i;
weg, dann wirst du vom Compiler gewarnt, wo du ein lokales verwenden solltest.
Wenn du wirklich Schleifen mit i brauchst, dann ERST RECHT lokal!!
(Auch dann solltest du andere Namen verwenden:
Code:
for (int zeile=0;...;...) {...}
Offensichtlich definierst du alles global! (Schwerer AnfängerFehler!)
Deshalb kann dein
Code:
ende
auch nicht funktionieren!
Du hast weder einen definierten Anfangswert, noch ein Zurücksetzen nach dem ersten Part!
Ab dem 2. Part kann nichts mehr gelesen werden, weil
Code:
ende
schon
Code:
true
ist!
Ich versuchs nochmal:
Java:
for(String part:partList1) {
// Schmeiß deine partList2 und partList3 weg, außer du willst's "draußen" verwenden
// (aber dann nimm vernünftige Namen!)
FileReader pa_fr = new FileReader(part.toString());
// partList2.add(pa_fr); // überflüssig! ... außer du willst's später verwenden
System.out.println("FileReader für Part '" + i + "' heißt: " + pa_fr);
StringBuilder pa_sb = new StringBuilder(7500);
boolean partEnde = false; // ich verwende absichtlich kein globales "ende"!!
while (!partEnde) {
gelesen = pa_fr.read());
partEnde = (gelesen != -1);
if (! partEnde)
pa_sb.append((char) gelesen);
}
// partList3.add(pa_sb); // überflüssig! ... außer du willst's später verwenden
System.out.println("String für Part '" + i + "' heißt: " + pa_sb);
pa_fr.close();
}
Den Fehler habe ich jetzt auch gefunden. Er ist einfach wie genial: ende bleibt einfach auf true gesetzt, dabei muss ende am Anfang der Schleife immer wieder auf false gesetzt werden.
Woher sollen wir wissen, was du mit Status des Dokuments meinst?
Woher sollen wir wissen, wie die Ausgabe aussehen soll wenn wir die AnfangsDaten nocht kennen?
Woher sollen wir wissen, was davon nun richtig, und was falsch ist?
1. Status des Dokuments = Status des Dokuments nach einem char einlesen
2. Du hast dir noch nicht alles durchgelesn:
- Ausgabe sollten die Daten der Datei sein...?
- AnfangsDaten: Pfad zu einem Ordner -> alle Ordner auflisten -> in den Ordnern nach einer bestimmten Datei suchen -> Dateien aufschreiben
3. Das, was ich hingeschrieben habe, war falsch. (Falls du das meinst...)
Hast du diesen Satz mal durchgelesen?
Was nun: Korrekt eingelesen ? oder Fehler beim Einlesen ?
Du hast ja recht. Was ich damit meinte, war, dass der Pfad korrekt eingelesen wurde, aber die Datei, auf die der Pfad verweist, nicht.
Das ist mal ne tolle Begründung.
Ziemlich beratungsresistent! Wenn du was mit i arbeitest, dann handelst du dir immer Probleme ein, wenn du damit unterschiedliche Array/Listen ansprichst!
Und: brauchst du deine Hilfs-Listen?
Variablen sollen möglichst kleine "Sichtbarkeit" haben!
Schmeiß als erstes dein globales int i; weg, dann wirst du vom Compiler gewarnt, wo du ein lokales verwenden solltest.
Wenn du wirklich Schleifen mit i brauchst, dann ERST RECHT lokal!!
(Auch dann solltest du andere Namen verwenden: for (int zeile=0;...;...) {...}
Offensichtlich definierst du alles global! (Schwerer AnfängerFehler!)
Deshalb kann dein ende auch nicht funktionieren!
Du hast weder einen definierten Anfangswert, noch ein Zurücksetzen nach dem ersten Part!
Ab dem 2. Part kann nichts mehr gelesen werden, weil ende schon true ist!
Hey, das mit dem ende funktioniert doch! partList3 wird übrigens noch benutzt. Du hast aber trotzdem recht, partList2 kann ich wegschmeissen. Warum muss ich i eigentlich lokal machen (und das andere auch)? Wegen des Speicherplatzes? Also, ich seh da kein Problem drin. Aber wenn du meinst... Wie definiert man den in der for-Schleife, dass mehrere Variablen lokal sind?
Java:
for(String part:partList1) {
// Schmeiß deine partList2 und partList3 weg, außer du willst's "draußen" verwenden
// (aber dann nimm vernünftige Namen!)
FileReader pa_fr = new FileReader(part.toString());
// partList2.add(pa_fr); // überflüssig! ... außer du willst's später verwenden
System.out.println("FileReader für Part '" + i + "' heißt: " + pa_fr);
StringBuilder pa_sb = new StringBuilder(7500);
boolean partEnde = false; // ich verwende absichtlich kein globales "ende"!!
while (!partEnde) {
gelesen = pa_fr.read());
partEnde = (gelesen != -1);
if (! partEnde)
pa_sb.append((char) gelesen);
}
// partList3.add(pa_sb); // überflüssig! ... außer du willst's später verwenden
System.out.println("String für Part '" + i + "' heißt: " + pa_sb);
pa_fr.close();
}
Sollte nicht aggressiv klingen, als Anfänger musst du dir Tipps halt sagen lassen.
Mit dem i hast du recht, das war ein Schlampigkeitsfehler von mir.
Es sollte dir aber zeigen, dass du Protokollzeilen "sprechender" ausführen solltest.
Lokale Variablen?
Am Beispiel partEnde siehst du, wo/wie du lokale Variablen definiern kannst.
Ob du damit kein Problem hast ist relativ unbedeutend.
Spätestens wenn du größere Projekte schreibst wirst du damit Probleme bekommen.
Es gibt keine Vorschrift, aber gehört zum Java-Wissen, dass die Sichtbarkeit möglichst klein gehalten werden soll.
Aber du glaubst, dass dein Problem gelöst ist? IRRTUM!
Dein
Code:
ende
KANN nicht funktionieren.
In deinem Code KANN nur der erste Eintrag aus partList abgearbeitet werden, jeder weitere Zeile KANN nicht funktionieren, weil wegen dem letzen
Code:
ende=true
die
Code:
while
-Schleife nicht mehr betreten wird!
Wenn du anderer Meinung bist, testest du irgendwie ganz verkehrt, oder du brauchst dein array partList gar nicht, weil du nur 1 Element verwendest.