Zum Inhalt springen
  • 0

Exception Fehler java.lang.ArrayIndexOutOfBoundsException


java_anfaenger

Frage

//Attribut in der Student Klasse
private int matrikelnummer = 0;

//Im Konstruktor ... 
matrikelnummer = Integer.parseInt(teile[1]);
Im Main :
public class MainProgramm { 

    static String file = "./ein/Studierende.txt";
    static HashMap<Integer,Student> studentobjekt = null;
    
    
    public static void main(String[] args) {
    	studentenVonListe();
    }
    	
    
    
    public static void studentenVonListe() {
    	studentobjekt = new HashMap<Integer, Student>();
    	try {
    		
    	
    		FileInputStream tmp = new FileInputStream(file);
    		InputStreamReader utf = new InputStreamReader(tmp, "UTF8");
    		BufferedReader temp = new BufferedReader(utf);
    		String zeile = "";
       	
    		while((zeile = temp.readLine()) != null) {
       		Student student = new Student(zeile);
       		studentobjekt.put(student.getMatrikelnummer(), student);
    		}
    	
    		tmp.close();
    		utf.close();
    		temp.close();
    	}
    	catch(IOException e) {
    		e.printStackTrace();
    	}
    }

Warum bekomme ich diesen Exception Fehler:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1

Eclipse weist auf diese Zeile :

InputStreamReader utf = new InputStreamReader(tmp, "UTF8");

oder diese Zeile in der Student klasse:

matrikelnummer = Integer.parseInt(teile[1]);

Ich hoffe jemand kann mir da einen Tipp geben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

13 Antworten auf diese Frage

Empfohlene Beiträge

  • 1

Wenn du schon Eclipse verwendest, dann benutze doch den Debugger. Setze an der Stelle ein Breakpoint. Dann kannst du den Code Schritt-für-Schritt anschauen und nachvollziehen, was er tut. Dann bekommst du dein Fehler auch schnell raus.

Mache dich mit deinen Werkzeugen vertraut.;)

 

Bearbeitet von Whiz-zarD
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Das geht aus dem gezeigten Code halt nicht hervor, dass du das machst. Nur das:

// Main
Student student = new Student(zeile);

// Konstruktor für Student
matrikelnummer = Integer.parseInt(teile[1]);

Weswegen natürlich davon ausgegangen werden darf/kann, dass du einen typo übersehen hast. 😃

 

Hast du dir teile mal ausgeben lassen, bevor du versuchst sie zu verarbeiten? Sieht das Array so aus, wie du es erwartest?

Wie sieht deine Textdatei aus? So oder so?

// Option 1: datei.txt

1
2,
3

--> Index = 1 erzeugt nach str.split() eine java.lang.ArrayIndexOutOfBoundsException.

// Option 2: datei.txt

1,Carwyn,FachrichtungY
2,Carwyn,FachrichtungA
3,Carwyn,FachrichtungY

--> Index = 1 kann nach str.split() bedenkenlos genutzt werden.

Und du weißt, dass ein Array mit Index 0 beginnt statt mit Index 1?
Sprich: Wenn die Matrikelnr. ganz vorne steht, wäre sie eh auf Index 0?

  

vor 7 Stunden schrieb java_anfaenger:

InputStreamReader utf = new InputStreamReader(tmp, "UTF8");

Dazu hab ich ansonsten noch das hier gefunden:

InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);

https://mkyong.com/java/how-to-read-utf-8-encoded-data-from-a-file-java/

Sieht aus als würde der InputStreamReader in neueren Java-Version etwas anders initialisiert werden. Hast du das mal probiert oder kannst du das mal probieren, vorausgesetzt dein Java-Dingsbums unterstützt das? 

Fragen über Fragen. 👀

Bearbeitet von Visar
Ergänzung zum InputStreamReader
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 8 Stunden schrieb Visar:

Das geht aus dem gezeigten Code halt nicht hervor, dass du das machst. Nur das:


// Main
Student student = new Student(zeile);

// Konstruktor für Student
matrikelnummer = Integer.parseInt(teile[1]);

Weswegen natürlich davon ausgegangen werden darf/kann, dass du einen typo übersehen hast. 😃

 

Hast du dir teile mal ausgeben lassen, bevor du versuchst sie zu verarbeiten? Sieht das Array so aus, wie du es erwartest?

Wie sieht deine Textdatei aus? So oder so?


// Option 1: datei.txt

1
2,
3

--> Index = 1 erzeugt nach str.split() eine java.lang.ArrayIndexOutOfBoundsException.

// Option 2: datei.txt

1,Carwyn,FachrichtungY
2,Carwyn,FachrichtungA
3,Carwyn,FachrichtungY

--> Index = 1 kann nach str.split() bedenkenlos genutzt werden.

Und du weißt, dass ein Array mit Index 0 beginnt statt mit Index 1?
Sprich: Wenn die Matrikelnr. ganz vorne steht, wäre sie eh auf Index 0?

  

Dazu hab ich ansonsten noch das hier gefunden:


InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);

https://mkyong.com/java/how-to-read-utf-8-encoded-data-from-a-file-java/

Sieht aus als würde der InputStreamReader in neueren Java-Version etwas anders initialisiert werden. Hast du das mal probiert oder kannst du das mal probieren, vorausgesetzt dein Java-Dingsbums unterstützt das? 

Fragen über Fragen. 👀

Ja die .txt ist so aufgebaut mit ",". Es funktioniert jetzt ohne Fehler nur gibt der nichts aus in der Konsole woran könnte es vermutlich liegen ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 46 Minuten schrieb java_anfaenger:

woran könnte es vermutlich liegen ?

 

vor 32 Minuten schrieb Whiz-zarD:

[...] benutze doch den Debugger. Setze an der Stelle ein Breakpoint. Dann kannst du den Code Schritt-für-Schritt anschauen und nachvollziehen, was er tut. Dann bekommst du dein Fehler auch schnell raus.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Dann fliegt doch da eine Exception. Dann schaue dir doch an, was studentenVonListe() macht.

Setze an die erste Zeile dieser Methode ein Breakpoint und durchlaufe Zeile für Zeile dein Code.

Wie sieht der konstruktor von Student und der Eingangsparamter aus? Offenbar splittest du ja den String und ich vermute, dass das nicht korrekt passiert.

Bearbeitet von Whiz-zarD
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 14 Minuten schrieb Whiz-zarD:

Dann fliegt doch da eine Exception. Dann schaue dir doch an, was studentenVonListe() macht.

Setze an die erste Zeile dieser Methode ein Breakpoint und durchlaufe Zeile für Zeile dein Code.

Wie sieht der konstruktor von Student und der Eingangsparamter aus? Offenbar splittest du ja den String und ich vermute, dass das nicht korrekt passiert.

package beuth;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Student {
	//-------------------------------------------
	// Attribute
	private String name = "";
	private int matrikelnummer = 0;
	private String studiengang = "";
	private Map<String, String> faecherZuNoten = null;
	
	//-------------------------------------------
	// Konstruktor
	public Student(String datenZeile) throws FalscherStudiengangAusnahme {
		
		try {
			// Daten in Teile aufteilen
			String[] teile = datenZeile.split(",");
			
			// Die Teile in Attribute zuordnen bzw. bearbeiten
			name = teile[0];
			matrikelnummer = Integer.parseInt(teile[1]);
			studiengang = teile[2];
			
			// Wenn noetig, Ausnahme werfen
			if (!studiengang.equalsIgnoreCase("Medieninformatik") &&
					!studiengang.equalsIgnoreCase("Technische Informatik") &&
					!studiengang.equalsIgnoreCase("Druck- und Medientechnik") &&
					!studiengang.equalsIgnoreCase("Screen Based Media")) {
				FalscherStudiengangAusnahme e = new FalscherStudiengangAusnahme(studiengang + " gehoert nicht dazu");
				throw e;
			}
			
			faecherZuNoten = new HashMap<String, String>();
		}
		catch (ArrayIndexOutOfBoundsException e) {
			throw e;
		}
		catch (NumberFormatException e) {
			throw e;
		}
	}
	
	//-------------------------------------------
	// Methoden
	public int getMatrikelnummer() {
		return matrikelnummer;
	}

	public String getName() {
		return name;
	}
	
	public String getStudiengang() {
		return studiengang;
	}
	
	public void noteEintragen(String fach, String note) {
		faecherZuNoten.put(fach, note);
	}
	
	public void setMatrikelnummer(int matrikelnummer) {
		this.matrikelnummer = matrikelnummer;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setStudiengang(String studiengang) {
		this.studiengang = studiengang;
	}

	public String toString() {
		String returnString = name
				+ " (" + matrikelnummer + "), "
				+ studiengang;
		return returnString;
	}
	
	public List<String> zeugnisZeilenAbrufen() {
		List<String> returnList = new ArrayList<String>();
		returnList.add(toString());
		
		// Faecher alphabetisch anordnen 
		List<String> faecher = new ArrayList<String>(faecherZuNoten.keySet());
		Collections.sort(faecher);
		
		// Eine Zeile fuer jedes Fach erstellen:
		// Name des Faches <tab> Note
		for (String fach : faecher) {
			returnList.add(fach + "\t" + faecherZuNoten.get(fach));
		}
		
		return returnList;
	}
}

So siehts aus ... 

 

meine txt sieht so aus

Anna Alt,800001,Medieninformatik

Bob Berg,800002,Medieninformatik

Carla Castor,800003,Medieninformatik

Daniel Dorf,800004,Medieninformatik

Eli Eiche,800005,Medieninformatik

 

Bearbeitet von java_anfaenger
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...