Hashmap begrenzt?

  • Antworten:9
  • Bentwortet
Frank Rudolf
  • Forum-Beiträge: 215

14.01.2016, 17:43:29 via Website

Ich lese eine Arraylist in eine Hashmap ein.

Dabei stoppt das Programm mit Fehler bei Zeile 264 des Arrays, beim 792. Key-Value-Paar (das Array wird pro Zeile in drei Bestandteile zerlegt, bevor es in die Hashmap überführt wird.

Der Fehler taucht bei der 39. Übereinstimmung einer bestimmten Key-Value-Kombination auf.

Die 264. Zeile enthält normale Buchstaben, Ziffern, Umlaute und den Doppelpunkt. Das gabs aber auch schon bei anderern Datensätzen vorher. Konkret wird der Fehler ausgelöst beim Einlesen der Ziffernfolge "26"(, die wie gesagt an dieser Stelle zum 39. Mal verarbeitet wird).

Kann es sein, dass eine Hashmap eine Grenze besitzt? Erst dachte ich an 255, aber die wird ja überschritten.

— geändert am 14.01.2016, 17:46:44

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

14.01.2016, 17:46:49 via Website

Was ist denn die genaue Exception, bzw. gibt es überhaupt eine.
Wie sieht dein Code aus?

LG Pascal //It's not a bug, it's a feature. :) ;)

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

14.01.2016, 17:51:20 via Website

Fehlermeldung:

Caused by: java.lang.ArrayIndexOutOfBoundsException: length=2; index=2

Mir ist schleierhaft, was das bedeutet.

Hier der Code, der mit i < 264 fehlerfrei funktioniert:

for(int i=0; i<264; i=i+1) {
String teil = arrayList.get(i); //zeile.split(";");
String[] teile = teil.split(";");
//String id = teile[0].toString();
//String info = teile[1].toString();
//String father = teile[2].toString();
System.out.print("Ergebnis:" + teile[1].toString());
map.put("id", teile[0].toString());
map.put("info", teile[1].toString());
map.put("father", teile[2].toString());
infoList.add(map);
map = new HashMap();
}

— geändert am 14.01.2016, 17:51:41

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

14.01.2016, 17:54:05 via Website

In welcher Zeile wird die Exception gethrowt?
Die Exception bedeutet, dass du in einem Array auf einen Index zugreifen willst (hier 2), den es gar nicht gibt, weil das Array nur die Größe zwei besitzt, also die Indexe 0 und 1 (aber nicht 2).

— geändert am 14.01.2016, 17:55:59

Frank Rudolf

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

14.01.2016, 17:57:22 via Website

Mit der HashMap stimmt soweit alles, ich würde das hier nicht machen:
map = new HashMap();
Im dümmsten fall überschreibst du damit deine HashMaps in der infoList, da nur ein Pointer übergeben wird.
Lieber in der For schleife eine Variable Definieren nud diese dann nur am Anfang initialisieren, dann sollte es passen.

Zum Fehler selber:
Das sieht mir sehr verdächtig nach einem Flaschen index durchs split aus, kommt hier vor:
map.put("info", teile[1].toString());
map.put("father", teile[2].toString());

Bevor du das machst musst du nämlich prüfen ob die Länge des String Arrays auch >=3 ist, sonst bekommst du diesen Fehler.
Ich nehme an, dass deine Daten aus dem String keine 3 Semikolons enthalten.
Am besten du prüfst das mal.

LG Pascal //It's not a bug, it's a feature. :) ;)

Frank RudolfGelöschter Account

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

14.01.2016, 18:03:54 via Website

Entschuldige, dass Wichtigste vergesse ich Heute ständig.

Der Fehler wird hier ausgelöst:

map.put("father", teile[2].toString());

Um die ArrayList kann es sich eigentlich nicht handeln. Die umfasst 1668 Elemente.

Man könnte an das Array Teile denken, das eigentlich in drei Teile aufgesplittet wird. Aber wo soll der Fehler liegen?

Ich will auch noch mal in die Original-CSV-Datei schauen, wieviele Semikolas da wirklich im 264. Datensatz existieren.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

14.01.2016, 18:05:27 via Website

Du baust einfach eine if über die länge da ein und setzt im else Zweig ein Breakpoint.
Dann schaust du dir den Inhalt der Variablen an und dann müsstest du die Lösung finden ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

Frank Rudolf

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

14.01.2016, 18:06:55 via Website

Dann wird es wahrscheinlich daran liegen, was Pascal gesagt hat. Das teile[2].toString() löst wahrscheinlich den Fehler aus, weil durch das split() keine 3 Elemente erzeugt wurden.

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

14.01.2016, 18:09:15 via Website

Ich glaube, ich habs gefunden.

Ich habe mir die Original-CSV-Datei angesehen und hier fehlt beim 264. Datensatz der dritte Inhalt (Father-Spalte) und das dazugehörige trennende Semikolon zum zweiten Inhalt des Datensatzes (Trenner zwischen Spalte 2 und 3). Ich hatte das Ganze aus Access heraus mit einem Menüpunkt in eine CSV exportiert.

Ich werde das Ganze mal korrigieren und neu ausführen. Aber heute abend wohl nicht mehr.

Ich danke Euch beiden Ganz, Ganz herzlich!!!

— geändert am 14.01.2016, 18:11:34

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

14.01.2016, 18:17:53 via Website

Sehr schön,
dann setzt diesen Thread doch bitte noch auf Beantwortet.
Danke :)

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten