File Konstruktor

Java-Insel

Aktives Mitglied
Hallöchen. Folgendes Problem:
Java:
import java.io.*;
...
File[] Liste2 = new File[anzahl];
...
int i;
for(i = 0; i < Liste.length; i++) {
Liste2[i] = new File(Liste1[i]);
Liste1 wurde übrigens schon vorher als File-Objekt deklariert. Trotzdem kommt diese Fehlermeldung:
Code:
Rechner.java:155: cannot find symbol
symbol  : constructor File(java.io.File)
location: class java.io.File
				Partlist3[anzahl]=new File(Partlist2[i]);
				                  ^
1 error
 
Oh, ist mir ein bisschen peinlich. richtiger Code:
Code:
Rechner.java:155: cannot find symbol
symbol  : constructor File(java.io.File)
location: class java.io.File
				Liste2[anzahl]=new Liste1(Partlist2[i]);
				               ^
1 error
 
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);
		}
	}
}
 
Partlist2 ist schon ein Array von File-Objekten
Java:
File[] Partlist2 = new File[Parts.length];
Daher kompiliert folgende Zeile natürlich nicht.
Java:
Partlist3[anzahl]=new File(Partlist2[i]);
Ich vermute Du meintest dieses hier
[TIPP]Partlist3[anzahl]=Partlist2;[/TIPP]
 
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.
 
Zuletzt bearbeitet:
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 ... 😉

Gruß Fant
 
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.
 
Zuletzt bearbeitet:
Du kannst auch einfach mal in den Catch-Blöcken überall ein
Code:
e.printStackTrace()
einbauen.
 
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?

Edit: finally-Block, natürlich.
 
Zuletzt bearbeitet:
[OT]Ich möchte doch gerne wissen mit welchen Werkzeugen du arbeitest und wie du vom Java-Quellcode zu einem ausführbaren Programm kommst?[/OT]
 
Code:
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".
 
Zuletzt bearbeitet:
Ich hab' den Text jetzt noch ein bisschen verkürzt, aber die Fehlermeldung kommt immernoch...
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(500);
			int gelesen;
			boolean ende = false;
			while(!ende) {
				gelesen = pfadstream.read();
			
				if(gelesen == -1) ende = true;
				else pfadspeicher.append((char) gelesen);
			}
			pfadstream.close();
			System.out.println(pfadspeicher);
			//Daten verarbeiten
			File PartsDir = new File(pfadspeicher.toString());
			String[] Parts = PartsDir.list();
			gelesen = 0;
			ende = false;
			File[] Partlist1 = 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] + "/part.cfg");
				if(Partlist1[i].exists() == false) continue;
				anzahl++;
			}
			System.out.println(anzahl);
			//part.cfg aufschreiben
			File[] Partlist2 = new File[anzahl];
			anzahl = 0;
			for(i=0;i < Partlist1.length;i++) {
				if(Partlist1[i].exists() == false) continue;
				Partlist2[anzahl]=Partlist1[i];
				anzahl++;
			}
			FileReader[] Partlist3 = new FileReader[anzahl];
			StringBuilder[] Partdata = new StringBuilder[anzahl];
			for(i = 0;i<anzahl;i++) {
				Partdata[i] = new StringBuilder(7500);
				Partlist3[i] = new FileReader(Partlist2[i].toString());
				while(!ende) {
					gelesen = Partlist3[i].read();
					
					if(gelesen == -1) ende = true;
					else Partdata[i].append((char) gelesen);
				}
				Partlist3[i].close();
			}
			System.out.println(Partdata[0].toString());
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
}
Wie ihr sehen könnt, habe ich ein paar Sachen ausgeben lassen: und bin drauf gekommen, dass
Code:
anzahl
gleich null ist. Wer weiß, warum, ich vermute, dass das mit dem
Code:
Partlist1[i]=new File(Parts[i] + "/part.cfg");
nicht so funktioniert wie gedacht. Könnte das sein? Wenn ja, wie kann ich das Beheben?
 
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]
 
Ah, ich glaub, ich hab' den Fehler:
Java:
Partlist1[i] = new File(Parts[i] + "/parts.cfg");
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:
 
Zuletzt bearbeitet:
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.
 
Java:
            File[] Partlist2 = new File[anzahl];
            anzahl = 0;
            for(i=0;i < Partlist1.length;i++) {
                if(Partlist1[i].exists() == false) continue;
                Partlist2[anzahl]=Partlist1[i];
                anzahl++;
            }

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") };
...
 
Java:
File[] Partlist2 = new File[anzahl];
            anzahl = 0;
            for(i=0;i < Partlist1.length;i++) {
                if(Partlist1[i].exists() == false) continue;
                Partlist2[anzahl]=Partlist1[i];
                anzahl++;
            }

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?

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.
 
Gut, Quelltext kleiner gemacht:
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
		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 Aufgabe😛ueh:
Rechner.main(Rechner.java:146)

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.
 
Zuletzt bearbeitet:
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...
 
Ähm.. Naja....😳

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)
 
Ja, was ist denn nun noch die Frage?

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)
 
Stimmt, ja. Aber die große Frage ist ja:

WARUM ist die Liste leer???

Bestimmt ist es ein klitzekleiner Fehler, der eigentlich typisch Anfängerfehler ist.
 
Mach doch wenigstens das Java-Tag
Code:
[Java=127]
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!
 
Zuletzt bearbeitet:
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:
Java:
	        for(i=0; i<Parts.length;i++) {
				File aktuell = new File(pfadspeicher.toString() + "/" + Parts[i] + "/part.cfg");
				System.out.println(aktuell.toString());
				if(aktuell.exists() == false) {
					System.out.println("falsch");
					continue;
				}
				else System.out.println("richtig");
				boolean wenn = Partlist1.add(aktuell);
				if(wenn == true) System.out.println("erfolgreich");
				System.out.println(Partlist1.get(i).toString());
			 }
 
Zuletzt bearbeitet:
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 part😛arts) {
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]
 
Zuletzt bearbeitet:
Und wieder trügt der Schein ;(...

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.
Java:
			for(i = 0;i<partList1.size();i++) {
				FileReader pa_fr = new FileReader(partList1.get(i).toString());
				partList2.add(pa_fr);
				System.out.println(partList2.get(i).toString());
				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);
				}
				System.out.println(partList3.get(i));
				partList2.get(i).close();
			}
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.
Woher sollen wir wissen, was du mit
Code:
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?

Wieder einmal werden alle die Pfade aller Segmente korrekt eingelesen, auch als solche erkannt, aber diesmal liegt der Fehler im Einlesen.
Hast du diesen Satz mal durchgelesen?
Was nun:
Code:
Korrekt eingelesen
? oder
Code:
Fehler beim Einlesen
?

Java:
for(i = 0;i<partList1.size();i++) {
	FileReader pa_fr = new FileReader(partList1.get(i).toString());
	partList2.add(pa_fr);
	System.out.println(partList2.get(i).toString());
	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);
	}
	System.out.println(partList3.get(i));
	partList2.get(i).close();
}
Diesmal habe ich übrigens die Zählvariable i benutzt, weil ich sie, wie man sehen kann, oft benutze.
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.
Das heißt dein Problem ist jetzt gelöst?
Was willst du uns dann mit diesem Post sagen?
 
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();
}
Klitzekleine Frage: wo hast du denn plötzlich wieder das i her?

Das heißt dein Problem ist jetzt gelöst?
Was willst du uns dann mit diesem Post sagen?
Ich habe das Problem gelöst, ja. Und was ich damit sagen will: Ich habe es gelöst.

Bitte werd nicht gleich so agressiv. Ich bin doch nur ein Anfänger. Und ich bin erst 12 (falls das jung für einen Java-Anfänger ist).
 
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.
 

Neue Themen


Zurück
Oben