ArrayIndexOutOfBounds

Dark-Nemesis

Grünschnabel
Kriege den fehler ArrayIndexOutOfBounds sobald in meiner CSV Datei eine Zeile mit einem ; endet, solange es nicht am ende der Zeile ist können auch ;; ohne fehler vorkommen.

Eine Lösung wie man dass lösen könnte wäre nicht verkehrt ;)

Code:
BufferedReader Datei = new BufferedReader(new FileReader("C:\\Documents and Settings\\Paul\\Desktop\\Script\\test.csv"));
            zeile = Datei.readLine();

            while (zeile != null)
            {
		if(zeile.contains(";"))
		{
			String[] daten = zeile.split(";");
		}
		else if(zeile.contains(","))
		{
			String[] daten = zeile.split(",");
		}
		else
		{
			System.out.println("File in wrong format! \n" +
					   "The file must be delimited with \";\" or \",\"!");
		}
                
		zeile = Datei.readLine();

//....

//SQL STATEMENTS
		String SqlUpdate = "Update `stundenplan` SET Stunde = '"+daten[0]+"', Montag = '"+daten[1]+"', Dienstag = '"+daten[2]+"', Mittwoch = '"+daten[3]+"', Donnerstag = '"+daten[4]+"', Freitag = '"+daten[5]+"' WHERE Stunde = '"+daten[0]+"' ";
		String SqlSelect = "SELECT Stunde FROM `stundenplan` WHERE Stunde = '"+daten[0]+"' ";
		String SqlInsert = "INSERT INTO `stundenplan` (Stunde, Montag, Dienstag, Mittwoch, Donnerstag, Freitag) VALUES ('"+daten[0]+"', '"+daten[1]+"', '"+daten[2]+"', '"+daten[3]+"', '"+daten[4]+"', '"+daten[5]+"') ";
		//SQL STATEMENTS
 
die zeile gibt groovy leider nicht an ...
der verdacht ist schon nicht verkehrt, da es ja beim letzten ; der fehler auftritt, die frage ist nur wie ich es schaffen kann das zu umgehen bei dem split hört er ja scheinbar bei dem letzten ; auf und setzt die daten[5] nicht auf leer bzw. legt den garnicht erst an :/
 
Hallo Dark,

das Problem ist, das Du davon ausgehst, das fünf mal das Semikolon in einer Zeile ist und jeweils davor und dahinter Text steht. In diesem Falle funktioniert Dein Programm theoretisch einwandfrei. Steht aber hinter dem letzten Semikolon kein Text kommt es zu eben jenem Fehler.

Die Frage ist halt, was soll passieren, wenn die Zeile quasi zu "kurz" ist? Soll danach einfach das SQL-Update ausgelassen werden oder soll es angepasst werden?

gruß klaus.
 
Das Programm sollte in dem Fall quasi einen leer string bzw null eintragen, das Feld muss aber auf jedenfall weiterhin berücksichtigt werden.
 
Hallo,

dann mach es doch einfach als if-Abfrage:
Code:
if(daten.length == 6) {
	String SqlUpdate = "Update `stundenplan` SET Stunde = '"+daten[0]+"', Montag = '"+daten[1]+"', Dienstag = '"+daten[2]+"', Mittwoch = '"+daten[3]+"', Donnerstag = '"+daten[4]+"', Freitag = ' ' WHERE Stunde = '"+daten[0]+"' ";
	String SqlSelect = "SELECT Stunde FROM `stundenplan` WHERE Stunde = '"+daten[0]+"' ";
	String SqlInsert = "INSERT INTO `stundenplan` (Stunde, Montag, Dienstag, Mittwoch, Donnerstag, Freitag) VALUES ('"+daten[0]+"', '"+daten[1]+"', '"+daten[2]+"', '"+daten[3]+"', '"+daten[4]+"', ' ') ";
} else {
	String SqlUpdate = "Update `stundenplan` SET Stunde = '"+daten[0]+"', Montag = '"+daten[1]+"', Dienstag = '"+daten[2]+"', Mittwoch = '"+daten[3]+"', Donnerstag = '"+daten[4]+"', Freitag = '"+daten[5]+"' WHERE Stunde = '"+daten[0]+"' ";
		String SqlSelect = "SELECT Stunde FROM `stundenplan` WHERE Stunde = '"+daten[0]+"' ";
		String SqlInsert = "INSERT INTO `stundenplan` (Stunde, Montag, Dienstag, Mittwoch, Donnerstag, Freitag) VALUES ('"+daten[0]+"', '"+daten[1]+"', '"+daten[2]+"', '"+daten[3]+"', '"+daten[4]+"', ' ') ";
}

gruß klaus.
 
Hallo,

du könntest es dann so lösen

Code:
String[] tmp = new String[6];

if(daten.length < 6)
for(int i = 0; i < daten.length; i++){
   tmp[i] = daten[i];
}


daten = tmp;

Also das müsstest du vor dem SQL-Statement ausführen.

MFG

zEriX
 
Ich sehe gerade, da hab ich noch Klammern vergessen. Das kommt davon wenn man das direkt hier schreibt. :)

Code:
String[] tmp = new String[6];

if(daten.length < 6){
for(int i = 0; i < daten.length; i++){
   tmp[i] = daten[i];
}


daten = tmp;
}


MFG

zEriX
 
Zurück