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
 

Java-Insel

Aktives Mitglied
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
 

Java-Insel

Aktives Mitglied
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);
		}
	}
}
 

turtle

Top Contributor
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]
 

Java-Insel

Aktives Mitglied
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:

Java-Insel

Aktives Mitglied
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...
 

Fant

Bekanntes Mitglied
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
 

Java-Insel

Aktives Mitglied
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:

Fant

Bekanntes Mitglied
Du kannst auch einfach mal in den Catch-Blöcken überall ein
Code:
e.printStackTrace()
einbauen.
 

Java-Insel

Aktives Mitglied
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:

turtle

Top Contributor
[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]
 

Java-Insel

Aktives Mitglied
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:

Java-Insel

Aktives Mitglied
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?
 

turtle

Top Contributor
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]
 

Java-Insel

Aktives Mitglied
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:

Java-Insel

Aktives Mitglied
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.
 

turtle

Top Contributor
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-Insel

Aktives Mitglied
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.
 

Java-Insel

Aktives Mitglied
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.
 

turtle

Top Contributor
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:pueh:
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:

Fant

Bekanntes Mitglied
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.
 

Java-Insel

Aktives Mitglied
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...
 

Java-Insel

Aktives Mitglied
Ähm.. Naja....:oops:

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)
 

Fant

Bekanntes Mitglied
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)
 

Java-Insel

Aktives Mitglied
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.
 

AquaBall

Top Contributor
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:

Java-Insel

Aktives Mitglied
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:

AquaBall

Top Contributor
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:parts) {
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:

Java-Insel

Aktives Mitglied
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.
 

AquaBall

Top Contributor
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?
 

Java-Insel

Aktives Mitglied
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).
 

AquaBall

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Übergabeparameter Konstruktor (File) Java Basics - Anfänger-Themen 13
W Java-PRogramm liest als EXE-File Nicht USB, jedoch aus NetBeans Java Basics - Anfänger-Themen 45
I Dateien in einem .war - File durchgehen? Java Basics - Anfänger-Themen 1
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
R File.pathSeparator und File.separator Java Basics - Anfänger-Themen 46
KeinJavaFreak Erste Schritte Java "Executable Jar File" nicht vorhanden Java Basics - Anfänger-Themen 1
izoards Prunsrv - Windows Service - .bat file starten Java Basics - Anfänger-Themen 84
I File Uploader... Statusanzeige, Berechnung des Status etc. Java Basics - Anfänger-Themen 0
I H2 Datenbank starten / Daten in File speichern Java Basics - Anfänger-Themen 25
G jar file lässt sich nicht öffnen Java Basics - Anfänger-Themen 1
N Textdatei aus Resourcen-Ordner eines Projekts/ jar-file lesen Java Basics - Anfänger-Themen 4
J File length als Prüfwert für Download Java Basics - Anfänger-Themen 5
berserkerdq2 Überprüfen ob eine Schreibberechtigung auf ein file exisitert bzw. ob man dieses file löschen kann, wie? Java Basics - Anfänger-Themen 9
berserkerdq2 IOstreams, was unterscheidet file von z. B. BufferedWriter? Java Basics - Anfänger-Themen 11
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
A java jar-File Java Basics - Anfänger-Themen 1
E Executable jar file fehler Java Basics - Anfänger-Themen 9
I Upload File zu einem Webservice Java Basics - Anfänger-Themen 17
I ZIP File erstellen Java Basics - Anfänger-Themen 10
LeoDerKek Textdatei in JAR-File Java Basics - Anfänger-Themen 4
Tom/S File Java Basics - Anfänger-Themen 10
AleXusher Mehrdimensionales Array aus txt.file auslesen Java Basics - Anfänger-Themen 4
A Checkstyle - File contains tab characters Java Basics - Anfänger-Themen 2
H Java file nicht gefunden Java Basics - Anfänger-Themen 5
C File speichern Java Basics - Anfänger-Themen 5
C Runnable Jar-File erzeugen Java Basics - Anfänger-Themen 14
C Pfad zu Properties-File bei ResourceBundle Java Basics - Anfänger-Themen 7
F GSON file mit einer List erstellen Java Basics - Anfänger-Themen 2
rafi072001 Lesen aus einem Excel File Java Basics - Anfänger-Themen 10
C Bild in executable JAR File mitgeben Java Basics - Anfänger-Themen 5
K File (png) in Image laden Java Basics - Anfänger-Themen 3
B Inputstream in file schreiben? Java Basics - Anfänger-Themen 23
S Input/Output Reader/Writer finden file nicht Java Basics - Anfänger-Themen 3
T Buffered Stream leert Txt File Java Basics - Anfänger-Themen 3
A 2d Arrays aus txt.file einlesen Java Basics - Anfänger-Themen 16
Dimax In Java File (nicht in Java Projekt) mysql Driver importieren Java Basics - Anfänger-Themen 3
K File wird in der .Jar nicht gefunden Java Basics - Anfänger-Themen 3
E TXT FILE EINLESEN Java Basics - Anfänger-Themen 4
Trèfle EXCEL-File Laufwerkunabhängig einbinden. Java Basics - Anfänger-Themen 1
B HTML File einlesen inkl. Bilder? Java Basics - Anfänger-Themen 2
B Hilfe bei InputStream To File Java Basics - Anfänger-Themen 22
topi relativer Pfad in einem Runnable JAR file Java Basics - Anfänger-Themen 12
A jar File kleiner bekommen Java Basics - Anfänger-Themen 3
B File öffnen in src/main/webapp Java Basics - Anfänger-Themen 4
K File-Name Vergleich Java Basics - Anfänger-Themen 2
krgewb Runnable JAR File Export Java Basics - Anfänger-Themen 11
S Maxium aus einer File finden Java Basics - Anfänger-Themen 12
dapzoo Class File Version zu niedrig? Ausführen über Eingabeaufforderung nicht möglich Java Basics - Anfänger-Themen 14
D Input/Output File exists canRead canWrite Java Basics - Anfänger-Themen 11
B cal4j - Error at line 1:Unexpected end of file Java Basics - Anfänger-Themen 0
P jar file lässt sich nicht ausführen Java Basics - Anfänger-Themen 4
E Best Practice Jar-file mit zwei Klassen und externer Bibliothek über Konsole erzeugen Java Basics - Anfänger-Themen 13
M Erste Schritte CSV-File einlesen und Daten verarbeiten Java Basics - Anfänger-Themen 5
F File von Windowsfreigabe laden Java Basics - Anfänger-Themen 1
S java.nio.file.FileSystemException bei Dateizugriff vermeiden Java Basics - Anfänger-Themen 7
Vince42 NIO File Tree in XML umwandeln Java Basics - Anfänger-Themen 10
J Zweidimensionales Array in CSV File exportieren Java Basics - Anfänger-Themen 3
E War-File Problem mit Eclipse Java Basics - Anfänger-Themen 3
B Excel File einlesen und Überschrift prüfen Java Basics - Anfänger-Themen 8
M Email versenden Outlook, attached File, ohne Anmeldung Java Basics - Anfänger-Themen 4
M Input/Output Word File Kopieren Java Basics - Anfänger-Themen 12
K Runable Jar File erstellen Java Basics - Anfänger-Themen 17
T Java Executable jar file funktioniert nicht Java Basics - Anfänger-Themen 4
sourcecorn Werte aus einem File lesen Java Basics - Anfänger-Themen 6
Kopak'rraf Korruptes zip File. Java Basics - Anfänger-Themen 0
T File für Einstellungen wird nicht geladen Java Basics - Anfänger-Themen 1
S Sounddatei in Jar File integrieren Java Basics - Anfänger-Themen 2
S Index File bauen Java Basics - Anfänger-Themen 5
T Anzeige, wie lange es noch dauert bis ein File gesendet ist. Java Basics - Anfänger-Themen 2
T filereader , file aus programm einlesen Java Basics - Anfänger-Themen 12
Ghostman1711 Itext PDF print File gelockt by Java Java Basics - Anfänger-Themen 15
N Email mit Anhang - File not Found Java Basics - Anfänger-Themen 1
K Interface Kein Bild im .jar-File Java Basics - Anfänger-Themen 15
S Bild in Jar-File mit ImageIO Java Basics - Anfänger-Themen 50
Syncopated Pandemonium Compiler-Fehler The constructor MP3File(File) refers to the missing type NoMPEGFramesException Java Basics - Anfänger-Themen 7
S File mit canRead() testen Java Basics - Anfänger-Themen 4
A file.delete funktioniert nicht Java Basics - Anfänger-Themen 15
K Classpath Lesen von Property-File Java Basics - Anfänger-Themen 1
S jar file Java Basics - Anfänger-Themen 19
B Fragen zu ZIP-File Java Basics - Anfänger-Themen 9
B Dateityp von File bekommen Java Basics - Anfänger-Themen 2
I Automatisch Verzeichnis erstellen bei File erstellen Java Basics - Anfänger-Themen 5
E Große Datenmengen effizient in CSV File speichern Java Basics - Anfänger-Themen 4
I String zu File umwandeln Java Basics - Anfänger-Themen 2
N File virtuell ByteStream Java Basics - Anfänger-Themen 11
Anfänger2011 file.isDirectory() liefert falschen Wert!? Java Basics - Anfänger-Themen 1
ms_cikar Jar file mit resource erzuegen Java Basics - Anfänger-Themen 28
E lesen csv file column by column Java Basics - Anfänger-Themen 10
U Anhand von Ant ein War-File erstellen Java Basics - Anfänger-Themen 0
B Quellcode einelsen "line by line" (und abspeichern in file (txt) Java Basics - Anfänger-Themen 7
O Zip-File Inhalt einlesen Java Basics - Anfänger-Themen 3
V Erste Schritte Dateinamen aus einer FIle[] in eine List Java Basics - Anfänger-Themen 11
P Jar File Java Basics - Anfänger-Themen 3
B Probleme bei "Daten in CSV File schreiben". Java Basics - Anfänger-Themen 9
S CSV File - "Vergleichen und Sortieren" Java Basics - Anfänger-Themen 3
T Wieso kann ich das jar file nicht starten? Java Basics - Anfänger-Themen 5
S Resourcen-Dateien im Jar-File verfügbar machen (Intellij 14) Java Basics - Anfänger-Themen 14
A Wieso übergibt der nicht die bearbeitete txt file Java Basics - Anfänger-Themen 8
Ruvok Executable Jar File startet nicht Java Basics - Anfänger-Themen 3

Ähnliche Java Themen


Oben