# String split Methode



## Kritiki (7. Dez 2012)

Hallo miteinander,

habe folgendes komisches Problem


```
public String reverseDate(String reverse) {
		
		String reverseResult;
		String []temp = reverse.split("\\.");
		
		reverseResult = temp[1];

		return reverseResult;
	}
```

temp[1] ist nur ein Test-Wert damit ich überprüfen kann ob das Richtige Ergebnis ausgegeben wird,
komischer weise kriege ich hier eine ArrayOutOfBoundException, in der variable Reverse steht ein String mit "." getrennt und ich möchte jetzt splitten mit dem Regex "\\." sodass ich daraus 3 Werte bekomme, zb. ein Datum

Wenn ich debugge und in der Laufzeit in das Array schaue sehe ich schön den String aufgesplittet in dem Array aber ich kann die Werte nicht ausgeben, ausser!! den [0] Wert, den bekomme ich, alle anderen lösen die Exception aus.

Kann man mir jemand das Phänomen erklären oder bin ich nur einfach zu Oberflächlich und sehe die einfache Lösung nicht.

Besten Dank im voraus


----------



## nillehammer (7. Dez 2012)

Du hast alles richtig gemacht. Habe es gerade überprüft:

```
String testStr = "22.01.2012";

    String[] temp = testStr.split("\\.");

    System.out.println(Arrays.toString(temp));
```
Wen split nur einen ein-Elementigen Array liefert, hat es den Splitstring nicht gefunden. Dass Du glaubst, im Debugger einen mehrelementigen Array gesehen zu haben, würde ich für eine Fehlinterpretation Deinerseits halten.


----------



## Kritiki (7. Dez 2012)

Hi,

also das Verständnis ist da ,

nur besteht jetzt noch die Frage ob ich trotzdem irgendwie die Inhalte einzeln ansprechen kann?

Aber ich glaube ich muss mich nach ner Alternativen umsehen.

Gruss


----------



## nillehammer (7. Dez 2012)

In dem von mir geposteten Code könntest Du durchaus temp[1] machen.

Was immer Du in Deinem Code machst, entweder der Split klappt und Du siehst im Debugger tatsächlich einen Array mit mehreren Elementen, dann greifst Du aber danach auf einen *anderen* Array zu oder Du fehlinterpretierst die Ausgabe des Debuggers und der Array hat nur ein Element. Dass Du in einem Array mit mehreren Elementen bei Zugriff auf [1] eine ArrayOutOfBoundException bekommst, ist schlicht ausgeschlossen.


----------



## Kritiki (7. Dez 2012)

hab mal nen bild vom debug angehängt,

ich Schliesse nicht aus das ich was falsch interpretiere, ist nur zur Überprüfung ob ich falsch liege oder nicht.

aber schonmal danke.


----------



## SlaterB (7. Dez 2012)

was soll dein Screenshot sagen?
dort ist reverse.split(".") zu sehen, hast du das im Debugger irgendwo als Auswertung unabhängig vom Code eingetippt?

reverse.split(".") liefert nur ein Array der Länge 1, alle Indexe außer 0 führen zur Exception

reverse.split("\\.") liefert dagegen ein Array der Länge 3, alle Indexe von 0 bis 2 funktionieren

im Screenshot ist ja auch zu sehen, dass Array temp die Länge 3 hat

-----

du kannst auch testweise auf das gefährliche Sonderzeichen . verzichten und (nur zum Test) mit # als Trennzeichen arbeiten,
dann gehts bestimmt auch im Debugger, was immer du da machst

------

für ein Forum wäre es erfreulich wenn du auf Debugger mit nicht nachvollziehbaren Einstellungen und ähnliche Späße verzichtest,
es zählt allein Java-Code und darin System.out.println()-Ausgaben, das kann jeder kopieren, nachvollziehen, läuft normalerweise überall gleich ab


----------



## D4rkscr43m (7. Dez 2012)

SlaterB hat gesagt.:


> reverse.split(".") liefert nur ein Array der Länge 1, alle Indexe außer 0 führen zur Exception



Bevor ich das so stehen lasse: ein split auf JEDES Zeichen führt zu einem LEEREN Array OHNE Einträge und auch der Index 0 führt zu einem Fehler!


----------



## SlaterB (7. Dez 2012)

nicht von der Hand zu weisen


----------



## Kritiki (7. Dez 2012)

es geht um das Array Temp, das es 3 werte hat die ich aber nicht einzeln ansprechend kann.
ich wollte das zur überprüfung anbringen weil nillehammer von einer fehlinterpretation des dimensionalen arrays gesprochen hat

das reverse.split hat keine bedeutung hier


----------



## SlaterB (7. Dez 2012)

nillehammer hat in Posting #2 Code gepostet, der in nahezu allen Fällen (*) funktionieren
bzw. in dem auch ein Zugriff temp[2] keine Exception werfen wird,

(*) Ausnahme ist vielleicht Grenzbereich im Arbeitsspeicher/ Stack/ stop() auf Thread aufgerufen usw.

--------

insofern ist keine echte Frage ersichtlich, split() funktioniert, das Array ist je nach Eingabe passend groß, Zugriffe dann möglich,
was immer bei dir vielleicht nicht geht hast du noch nicht besonders ausführlich beschrieben, 

und nochmal: ideal sind immer vollständige Programm, ohne offene unbekannte Eingabe-Parameter an Methoden,
ohne Benutzereingaben, Lesen aus Dateien, Math.random() usw., 

kopieren, laufen lassen, Fehler auch bei anderen, oder meist Problem unbekannt


----------



## Ofof91 (10. Dez 2012)

```
for(count=0;count<(features.length-1)&&!choice.equals("");count++) 
       {    
        System.out.println("Please enter a feature (name=description) or hit enter to return");
        choice=Input.readString();
        String[] split=choice.split("=");
        Feature feat=new Feature(split[0],split[1]);
        features[count]=feat;
             }
```

Fehlermeldung: ArrayIndexOutOfBoundsException: 1

Irgendwie passt ihm split[1] nicht, aber warum nicht?


----------



## SlaterB (10. Dez 2012)

das split sollte funktionieren aber was eingegeben wird ist hier nicht zu erkennen, gibt doch choice aus,
vielleicht liest readString() nur bis zum =, möchte ich selber zunächst nicht testen

wenn man nur Enter klickt muss der Programmablauf dort übrigens auch vorbei..


----------



## Ofof91 (10. Dez 2012)

SlaterB hat gesagt.:


> das split sollte funktionieren aber was eingegeben wird ist hier nicht zu erkennen, gibt doch choice aus,
> vielleicht liest readString() nur bis zum =, möchte ich selber zunächst nicht testen
> 
> wenn man nur Enter klickt muss der Code dort übrigens auch vorbei..



wenn ich choice ausgebe, dann wird das eingegebene ausgegeben...

wenn man, bevor man etwas eingibt, enter klickt, dann kommt die fehlermeldung genauso


----------



## Ofof91 (10. Dez 2012)

wenn ich split[0] und split[1] ausgeben lasse, dann gibt er genau das was ich eingegeben habe, aus


----------



## Ofof91 (10. Dez 2012)

der fehler kommt sobald ich nichts eingebe und enter klicke, sonst nicht...


----------



## Ofof91 (10. Dez 2012)

wenn ich etwas ohne dem "=" eingebe, dann kommt auch eine fehlermeldung, obwohl er bei split[0] das was ich eingegeben habe ausgibt, und bei split[1] gibt er genaus das selbe aus..

choice: ee

split[0]= ee
split[1]= ee

Fehlermeldung..


----------



## SlaterB (10. Dez 2012)

tja, wie stellst du dir denn den Ablauf nach einem Enter vor?
überspringe z.B. den Rest mit einem if,

für den Fall dass jemand 'hallo' eintippt sollte dein Programm besser auch nicht mit Exception reagieren


----------



## Ofof91 (10. Dez 2012)

SlaterB hat gesagt.:


> tja, wie stellst du dir denn den Ablauf nach einem Enter vor?
> überspringe z.B. den Rest mit einem if,
> 
> für den Fall dass jemand 'hallo' eintippt sollte dein Programm besser auch nicht mit Exception reagieren



Jep, es geht...

Wie kann ich das verhindern dass er nicht mit Exception reagiert?


----------



## Ofof91 (10. Dez 2012)

Ofof91 hat gesagt.:


> Jep, es geht...
> 
> Wie kann ich das verhindern dass er mit Exception reagiert?



Nach "=" suchen lassen?


----------



## SlaterB (10. Dez 2012)

oder auch die Länge von split anschauen, vieles ist möglich


----------



## puls (11. Dez 2012)

Hi,

versuche es mal damit.


```
public String reverseDate(String reverse) 
{
        String reverseResult;
        String []temp = reverse.split("[\\.]");
        
        reverseResult = temp[1];
 
        return reverseResult;
    }
```


----------

