ArrayIndexOutOfBounds

Status
Nicht offen für weitere Antworten.

julchen81

Bekanntes Mitglied
Hallo!

Ich hab eine ganz einfach Methode geschrieben, die aber bei mir mal wieder nicht funktionieren will:
Code:
public void zuweisen() throws IOException {
		BufferedReader brl = new BufferedReader(new FileReader("S:/quelle.dat"));
		String line = brl.readLine();
		
		while (line.indexOf("-->") < 0) {
			line = brl.readLine();
		}
		
		System.out.println(line);
		
		while (line.indexOf("ENDE") < 0) {
			String[] parts = line.split("-->");
			for (int i = 0; i < parts.length; i++) {
				System.out.println("hier: " + parts[i]);
			}
			System.out.println("parts0: " + parts[0] + "Ende");
			System.out.println("parts1: " + parts[1] + "Ende");
			System.out.println("parts2: " + parts[2] + "Ende");
			parts[0] = parts[0].trim();          
			parts[1] = parts[1].trim();
		
			if (parts[1].equals("R101")) {
				TR101 = parts[0];
			} else if (parts[1].equals("R102")) {
				TR102 = parts[0];
			} else if (parts[1].equals("R103")) {
				TR103 = parts[0];
			} else if (parts[1].equals("R104")) {
            
            .......

			} else if (parts[1].equals("R899")) {
				TR899 = parts[0];
			} 
			line = brl.readLine();
			System.out.println(line);
		}
	}

Die Zeile System.out.println(line); gibt mir noch die korrekte Zeile aus:
d --> R821 --> RT Durchmesser am Schlepprahmen

Dann splite ich diesen String durch "-->" und schreibe die einzelnen Teile in das Array parts.
Wieso wirft's mir aber eine ArrayIndexOutOfBoundsException??

Das Array hat doch die richtige Länge... komischerweise gibt es keine Beschwerden in der for-Schleife, aber bei den drei System.out.println("parts0: " + parts[0] + "Ende") (bzw. parts[1], parts[2]) scheint's dann zu hapern. Je nach dem, was ich auskommentiere. Hab da Verschiedenes probiert. Und mein Verdacht: sobald ich irgendwo auf die Elemente des Arrays zugreife, hapert's.

Weiß jemand, wieso?? :bahnhof:

LG Julia
 
S

SlaterB

Gast
offensichtlich ist das Array nicht lang genug,
schreibe am Anfang der Schleife

if (parts.length < 3) {
System.out.println("gleich wirds gehörig schiefgehen");
}

wenns noch nicht klappt:
finde genau raus, in welcher Zeile der Exception kommt
und prüfe an genau dieser Stelle die Länge des Arrays
 

julchen81

Bekanntes Mitglied
auf parts[3] greife ich nie zu...

hab jetzt noch unmittelbar vor der Fehlermeldung die Länge des Arrays überprüft sowie von Haus aus die Länge auf 3 festgelegt:
Code:
while (line.indexOf("ENDE") < 0) {
			String[] parts = new String[3];
			parts = line.split("-->");
			System.out.println("Länge: " + parts.length);
			
			parts[0] = parts[0].trim();          //Entfernen der Leerzeichen bei der Variablen
			parts[1] = parts[1].trim();			 //Entfernen der Leerzeichen beim Maschinencode
			System.out.println("Länge die Zweite: " + parts.length);
			parts[2] = parts[2].trim();
		
			if (parts[1].equals("R101")) {
				TR101 = parts[0];
			} else if (parts[1].equals("R102")) {
         ................

Und trotzdem wird mir die Exception geworfen. System.out.println("Länge: " + parts.length); und System.out.println("Länge die Zweite: " + parts.length); bestätigen mir jeweils ArrayLänge 3.

Der Fehler tritt in Zeile 10 auf.

weil meine While-Schleife mehrere Zeilen einliest, sehe ich, dass diese Fehlermeldung bei den folgenden Zeilen nicht mehr passiert. So sieht übrigens meine quelle.dat-Datei aus:

C101 Z?98 a?99 K1 M5 T1 t101 v0 s1800 g20000 h20000 i5000 j30000
d --> R821 --> RT Durchmesser am Schlepprahmen
e --> R822 --> FT Durchmesser am Schlepprahmen
f --> R826 --> HFT Durchmesser am Schlepprahmen
h --> R827 --> GHFT Durchmesser am Schlepprahmen
--> R581 -->
c --> R582 --> Aufnahmeposition_HFT
a --> R583 --> Ablegeposition_HFT
v --> R584 --> Freigabe Shuttle
q --> R585 --> Aufnahmeposition_fuer_FT_(Wender)
j --> R586 --> Ablegeposition_FT
--> R340 -->
g --> R521 --> nichts = Beladebandgeschwindigkeit schnell (60'000)
Wert = Beladebandgeschwindigkeit langsam (Wert)
h --> R522 --> nichts = Beladebandgeschwindigkeit schnell (60'000)
Wert = Beladebandgeschwindigkeit langsam (Wert)
i --> R523 --> nichts = Beladebandgeschwindigkeit schnell (60'000)
Wert = Beladebandgeschwindigkeit langsam (Wert)
j --> R524 --> nichts = Beladebandgeschwindigkeit schnell (60'000)
Wert = Beladebandgeschwindigkeit langsam (Wert)
b --> R500 --> Bearbeitungsart
1 => Simultanbearbeitung
2 => Wendebearbeitung (Dummy)
3 => Bearbeiten nur links
4 => Bearbeiten nur rechts
k --> R517 --> Fertigteil wenden 0=nicht wenden 1=wenden
--> R708 -->
ENDE
...

(wobei momentan sowieso nur bis "--> R581 -->" gelesen wird, aus welchen Gründen auch immer; darum kümmere ich mich im Anschluss).

LG und schon mal wieder dickes Danke!
Julia
 
S

SlaterB

Gast
gib doch mal die Error-Ausgabe, deine Ausgaben davor usw.

die müssen nicht immer unbedingt in der richtigen Reihenfolge stehen,
also schaue dir die gesamte Ausgabe an,

und verwende
Code:
System.out.println("Länge die Zweite: " + parts.length); 
if (parts.length < 3) {
  System.out.println("Länge war kleiner 3, Programmende"); 
  System.exit(0);
} else {
         parts[2] = parts[2].trim(); 
}
hast du nun immer noch eine ArrayIndexOutOfBoundsException in dieser Zeile?
(auf geänderte Zeilennummer achten)

falls NullPointerException oder so, das wäre was anderes
 
G

Guest

Gast
Und genau bei der Zeile "--> R581 -->" liegt dein Problem :)

Das Array daraus hat nämlich nicht Länge 3, sondern nur Länge 2, weil nach dem letzten --> nichts mehr kommt werden auch nur 2 Strings gebildet und keine 3.
 
G

Guest

Gast
Achja und die erste Zeile

C101 Z?98 a?99 K1 M5 T1 t101 v0 s1800 g20000 h20000 i5000 j30000

wird bei split auch keine Array mit der Länge 3 geben
 

julchen81

Bekanntes Mitglied
Jetzt hab ich dein if eingebaut:

Code:
while (line.indexOf("ENDE") < 0) {			
			String [] parts = line.split("-->");
			System.out.println("Länge: " + parts.length);
			
			parts[0] = parts[0].trim();          //Entfernen der Leerzeichen bei der Variablen
			parts[1] = parts[1].trim();			 //Entfernen der Leerzeichen beim Maschinencode
			System.out.println("Länge die Zweite: " + parts.length);
			if (parts.length < 3) { 
				  System.out.println("Länge war kleiner 3, Programmende"); 
				  System.exit(0); 
				} else { 
				         parts[2] = parts[2].trim(); 
				}
			parts[2] = parts[2].trim();
			
			if (parts[1].equals("R101")) {
				TR101 = parts[0];
			} else if (parts[1].equals("R102")) {
        ...........

Ich erhalte - genau wie ohne if - folgende Ausgabe/Fehlermeldung:

Code:
d --> R821 --> RT Durchmesser am Schlepprahmen
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
	at Variables.zuweisen(Variables.java:229)
	at Variables.<init>(Variables.java:207)
	at Start.main(Start.java:6)
Länge: 3
Länge die Zweite: 3
e --> R822 --> FT Durchmesser am Schlepprahmen
Länge: 3
Länge die Zweite: 3
f --> R826 --> HFT Durchmesser am Schlepprahmen
Länge: 3
Länge die Zweite: 3
h --> R827 --> GHFT Durchmesser am Schlepprahmen
Länge: 3
Länge die Zweite: 3 
  --> R581 --> 
...

wobei "Variables.java:229" mich zu Zeile 7 bringt.

Bin wirklich froh, dass du mir hilfst :)

Julia
 
S

SlaterB

Gast
> Länge die Zweite: 3
> --> R581 -->
> ...

hey, genau dieses ... ist das spannende, denn in dieser Zeile wird doch wohl die Exception auftreten, was kommt da bei Länge raus?

wie gesagt ist die Exception-Ausgabe evtl. in einer völlig anderen Zeile in der Konsole,
du kannst nicht davon ausgehen, dass sie bei den jeweiligen anderen Ausgaben richtig eingeordnet ist

-------

und überhaupt: wenn die Exception in Zeile 7 auftritt,
dann haben wir ja hier eine ganz andere Situation,
was soll dann mein Code ab Zeile 9 bewirken?!?!
 

julchen81

Bekanntes Mitglied
Jetzt hab ich das Ganze noch mal in einem extra Programm geschrieben:
Code:
import java.io.*;


public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader brl = new BufferedReader(new FileReader("S:/Fertigungsdienste_Admin/Projekte-Praktikanten/Krieg Stefanie/Swing3/quelle.dat"));
		String line = brl.readLine();
		
		while (line.indexOf("-->") < 0) {
			line = brl.readLine();
		}
		
		while (line.indexOf("ENDE") < 0) {
			if (line.indexOf("-->") >= 0) {
			
				String [] parts = line.split("-->");
				System.out.println(line);
			
				parts[0] = parts[0].trim();          //Entfernen der Leerzeichen bei der Variablen
				parts[1] = parts[1].trim();			 //Entfernen der Leerzeichen beim Maschinencode
				parts[2] = parts[2].trim();
			}
			line = brl.readLine();
		}
	}
}

Das betrachtet jetzt schon mal die Zeilen ohne "-->" nicht mehr. Die erste Fehlerquelle wird also ausgeschlossen.

Was mir jetzt wirklich noch Probleme bereitet sind die von dir angesprochenen Zeilen, hatte grad dieselbe Idee und dann das Programm ausgeführt, wenn es im Quelltext nur noch "3-Teilige" Zeilen gibt und - es funktioniert!!

Aber das fang ich mit if Länge = 2 bzw. 3 ab...

Schade, dass man offensichtlich nicht einfach folgendes machen kann:

Code:
String [] parts = new String[3];
parts[2] = " ";
parts = line.split("-->");
...

denn wenn die Zeile nur aus zwei Teilen besteht, funktioniert's nicht. Es könnte doch diese zwei Teile nach parts[0] und parts[1] einfügen und parts[2] belassen, wäre so schön elegant...

Dickes Danke wieder mal!
LG Julia
 

julchen81

Bekanntes Mitglied
ach ja und gut zu wissen, dass die Reihenfolge der ExceptionMeldungen bzw. Ausgabe nicht immer aussagt, wo der Fehler liegt. Das wusste ich bisher nicht.

@Gast:
die erste Zeile liefert kein Problem, denn die wurde mit
Code:
while (line.indexOf("-->") < 0) {
			line = brl.readLine();
		}

ausgeblendet.

LG
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben