java_anfaenger Geschrieben 13. Januar 2021 Geschrieben 13. Januar 2021 //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. Zitieren
1 Visar Geschrieben 13. Januar 2021 Geschrieben 13. Januar 2021 vor einer Stunde schrieb java_anfaenger: teile[1] Meinten Sie vielleicht: zeile? thereisnospace reagierte darauf 1 Zitieren
1 Whiz-zarD Geschrieben 14. Januar 2021 Geschrieben 14. Januar 2021 vor 39 Minuten schrieb allesweg: Zusätzlich: wenn du derzeit Java lernst, warum nutzt du dann nicht try with ressource? ( @Visar das ist die von dir verlinkte Variante) Oder gleich den Debugger... Zitieren
1 Whiz-zarD Geschrieben 14. Januar 2021 Geschrieben 14. Januar 2021 (bearbeitet) 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 14. Januar 2021 von Whiz-zarD allesweg reagierte darauf 1 Zitieren
0 java_anfaenger Geschrieben 14. Januar 2021 Autor Geschrieben 14. Januar 2021 vor 5 Stunden schrieb Visar: Meinten Sie vielleicht: zeile? ne, teile stimmt schon deshalb ... String[] teile = datenZeile.split(","); ich splitte sozusagen in der .txt Zitieren
0 Visar Geschrieben 14. Januar 2021 Geschrieben 14. Januar 2021 (bearbeitet) 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 14. Januar 2021 von Visar Ergänzung zum InputStreamReader Zitieren
0 MartinSt Geschrieben 14. Januar 2021 Geschrieben 14. Januar 2021 Btw: Zu deinem Zweck nimmt man besser einen Tokenizer statt die CSV manuell zu zerhacken. Zitieren
0 allesweg Geschrieben 14. Januar 2021 Geschrieben 14. Januar 2021 Die Codeschnipsel reichen nicht aus, um dein Problem zu lösen. Zusätzlich: wenn du derzeit Java lernst, warum nutzt du dann nicht try with ressource? ( @Visar das ist die von dir verlinkte Variante) Zitieren
0 java_anfaenger Geschrieben 14. Januar 2021 Autor Geschrieben 14. Januar 2021 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 ? allesweg reagierte darauf 1 Zitieren
0 pr0gg3r Geschrieben 14. Januar 2021 Geschrieben 14. Januar 2021 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. Zitieren
0 java_anfaenger Geschrieben 14. Januar 2021 Autor Geschrieben 14. Januar 2021 vor 12 Minuten schrieb pr0gg3r: habe ich gemacht .. der Debugger funkt. nicht so wie auf dem Video .. ich kann nur sehen was er mir Rot anzeigt und die Stelle ist beim catch(){} was ich nicht verstehe. Zitieren
0 Whiz-zarD Geschrieben 14. Januar 2021 Geschrieben 14. Januar 2021 (bearbeitet) 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 14. Januar 2021 von Whiz-zarD Zitieren
0 java_anfaenger Geschrieben 14. Januar 2021 Autor Geschrieben 14. Januar 2021 (bearbeitet) 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 14. Januar 2021 von java_anfaenger Zitieren
0 java_anfaenger Geschrieben 14. Januar 2021 Autor Geschrieben 14. Januar 2021 Hat sich erledigt.. mit der Ausgabe Zitieren
Frage
java_anfaenger
Warum bekomme ich diesen Exception Fehler:
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.
13 Antworten auf diese Frage
Empfohlene Beiträge
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.