String index out of range: -1 beim Datei Parsen

rookie94

Neues Mitglied
Hey Leute habe folgendes Problem: Ich möchte eine Methode schreiben, die ein Drehbuch als .txt-Dokument Zeile für Zeile einließt und anhand des jeweils ersten Wortes der Zeile zählt welche Rolle wie oft gesprochen hat.
Ein Auszug aus dem Drehbuch:
"KELLY Let go of my hair, you little psychopath!

BUD Die, commie bimbo!

Bud pretends to cut her throat with a toy knife.

PEGGY Now, Bud, I thought we talked about this before."

Hier mein Lösungsversuch:
Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class scriptreader {

    public static void countRedeanteil(File file) {
 

        if (!file.canRead() || !file.isFile())
            System.exit(0);

            BufferedReader in = null;
            
            int Al=0;
            int Peg=0;
            int Steve=0;
            int Marcy=0;
            int Kelly=0;
            int Bud=0;
            int Buck=0;
      
            
       try {
          
            in = new BufferedReader(new FileReader(file));
            String zeile = new String();
            String Rolle = new String();
            while ((zeile = in.readLine()) != null) {
              Rolle = zeile.substring(0,zeile.indexOf(" "));  //Zeile 30 (FehlerQuelle)
              switch (Rolle) {
              case "AL":
                  Al++;
                  break;
              case "PEGGY":
                  Peg++;
                  break;
              case "STEVE":
                  Steve++;
                  break;
              case "MARCY":
                  Marcy++;
                  break;
              case"KELLY":
                  Kelly++;
                  break;
              case"BUD":
                  Bud++;
                  break;
              case"BUCK":
                  Buck++;
                  break;
             default:
                 break;
            }
            }
        
       } catch (IOException e) {
            e.printStackTrace();
            
       System.out.println("Al's Redeanteil: " +Al+"Peg's Redeanteil: "+Peg+"Steve's Redeanteil: "+Steve+"Marcy's Redeanteil: "+Marcy+"Kelly's Redeanteil: "+Kelly+"Bud's Redeanteil: "+Bud+"Buck's Redeanteil: "+Buck);     
      
       } finally {
            if (in != null)
      
                try {
                    in.close();
                
                } catch (IOException e) {
                
                }
        }
    }


}

Nun wird beim ausführen jedoch folgende Fehlermeldung ausgegeben:

"Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(Unknown Source)
at scriptreader.countRedeanteil(scriptreader.java:30)"

Jemand eine Idee zur Lösung meines Problems?

Viele Grüße
 

Voldemort92

Mitglied
Was ich mir vorstellen könnte: Das Script enthält leere Zeilen, die insbesondere keine Leerstellen enthalten. Bei denen meckert Zeile 30 dann.
Schau dir mal die String.split Funktion an. Sie splittet einen String bei einem (oder mehreren) angegebenen Zeichen (hier Leerstellen) und gibt dir ein Array aus Strings zurück. Das erste Element des Arrays würde hier dann den Namen enthalten. Meines Wissens sollte bei den leeren Zeilen da nix passieren, da split() dann einfach nichts macht bzw. die leere Zeile als einziges Element des Arrays zurückgibt.
 

rookie94

Neues Mitglied
Was ich mir vorstellen könnte: Das Script enthält leere Zeilen, die insbesondere keine Leerstellen enthalten. Bei denen meckert Zeile 30 dann.
Schau dir mal die String.split Funktion an. Sie splittet einen String bei einem (oder mehreren) angegebenen Zeichen (hier Leerstellen) und gibt dir ein Array aus Strings zurück. Das erste Element des Arrays würde hier dann den Namen enthalten. Meines Wissens sollte bei den leeren Zeilen da nix passieren, da split() dann einfach nichts macht bzw. die leere Zeile als einziges Element des Arrays zurückgibt.

Danke erst mal für die schnelle Antwort.
Habe Versucht die split() Methode zu verwenden doch leider wird eine ähnliche Fehlermeldung ausgegeben:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at scriptreader.countRedeanteil(scriptreader.java:30)

Hier nochmal mein veränderter Code:


Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class scriptreader {

    public static void countRedeanteil(File file) {
 

        if (!file.canRead() || !file.isFile())
            System.exit(0);

            BufferedReader in = null;
            int Al=0;
            int Peg=0;
            int Steve=0;
            int Marcy=0;
            int Kelly=0;
            int Bud=0;
            int Buck=0;
      
            
       try {
          
            in = new BufferedReader(new FileReader(file));
            String zeile = new String();     
            while ((zeile = in.readLine()) != null) {
            String[] Rolle = zeile.split(" ");
              switch (Rolle[0]) {
              case "AL":
                  Al++;
                  break;
              case "PEGGY":
                  Peg++;
                  break;
              case "STEVE":
                  Steve++;
                  break;
              case "MARCY":
                  Marcy++;
                  break;
              case"KELLY":
                  Kelly++;
                  break;
              case"BUD":
                  Bud++;
                  break;
              case"BUCK":
                  Buck++;
                  break;
             default:
                 break;
            }
            }
        
       } catch (IOException e) {
            e.printStackTrace();
            
       System.out.println("Al's Redeanteil: " +Al+"Peg's Redeanteil: "+Peg+"Steve's Redeanteil: "+Steve+"Marcy's Redeanteil: "+Marcy+"Kelly's Redeanteil: "+Kelly+"Bud's Redeanteil: "+Bud+"Buck's Redeanteil: "+Buck);     
      
       } finally {
            if (in != null)
      
                try {
                    in.close();
                
                } catch (IOException e) {
                
                }
        }
    }

    
    
}
 

Voldemort92

Mitglied
Also bei mir funktioniert es, poste vielleicht mal deine Textdatei mit der du es testest.

PS: Die System.out.println Zeile zwischen dem try/catch/finally Block wird dort übersprungen. Verschieb sie lieber in den try-Block (hinter die while-Schleife).
 

Thallius

Top Contributor
Du solltest dir wirklich mal angewöhnen Methode auf Ihre Rückgabewerte zu testen...

indexOf gibt -1 zurück wenn es den gesuchten String nicht findet. Also warum nicht einfach erstmal den indexOf machen und dann testen ob was er zurück gibt?

Gleiches beim Split. Du gehst einfach davon aus, dass Rolle[0] einen String enthält. Der kann aber auch leer sein. Was denn dann?

Gruß

Claus
 

mrBrown

Super-Moderator
Mitarbeiter
Gleiches beim Split. Du gehst einfach davon aus, dass Rolle[0] einen String enthält. Der kann aber auch leer sein. Was denn dann?
In welchem Fall kann das leer sein? (Ernstgemeinte Frage, ich wüsste keinen Fall, das Javadoc gibts nicht her und Code am Handy durchgucken ist echt ekelig)

Edit: selber gefunden, sollte in diesem Fall mit 'nem trim lösbar sein.
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Streams sind doch manchmal was feines...

Java:
        Map<String, Long> counts = Files.lines(Paths.get("test.txt"))
            .map(String::trim)
            .map(line -> line.split(" ")[0])
            .filter(line -> !line.isEmpty())
            .filter(line -> line.equals(line.toUpperCase()))
            .collect(groupingBy(String::toString, counting()));
        System.out.println(counts);
 

mrBrown

Super-Moderator
Mitarbeiter
Und was habe ich oben geschrieben? "Der kann aber auch leer sein"

Wir könnten uns da jetzt ich länger im Kreis drehen, vermutlich haben wir einfach aneinander vorbei geredet...
Du gehst einfach davon aus, dass Rolle[0] einen String enthält
Wenn es Rolle[0] gibt, steht da auch ein String drin - das problem ist ja eben, dass es Rolle selbst leer ist (und Rolle[0] nicht existiert).

Der kann aber auch leer sein.

Das könnte sich jetzt entweder auf das Array selbst oder auf den String an Index 0 aus dem Vorsatz beziehen.
Wenn es sich auf den String bezieht: Ja, der String kann leer sein, wird aber in dem Code vollkommen korrekt behandelt, die Fehlermeldung bezieht sich ja auch auf das leere Array.
Oder aber du meinst das Array: dann ist das vollkommen richtig und ist vermutlich auch das, was du meintest. Meine Frage, wann das passiert, bezog sich ja auch auf genau diesen Fall - allerdings ist dann deine Antwort auf die Frage falsch:

Wenn die Zeile nichts enthält dann kriegst du einen leeren String zurück oder nicht?
Einen String bekommt man bei split nie zurück, deshalb bin ich davon ausgegangen, dass du ein leeres Array meinst (außerdem deutet die Fehlermeldung, auf die du dich bezogen hast, ja auf ein leeres Array hin).

Das Array kann in Ausnahmefällen leer sein (dann, wenn der gesamte String vom Pattern "gematched" wird, Ausnahme ist dabei der leere String), ist aber nie leer, wenn man einen leeren String splittet.

Falls du doch die Stings meintest: die Strings in dem Array können auch leer sein, leerer String wäre da eine Möglichkeit für (gibt auch noch ein paar andere, in diesem Fall zB ein String, der in der Mitte zwei Leerzeichen enthält wie "a b").



Deshalb gehe ich einfach mal davon aus, dass wir aneinander vorbei geredet haben. Du hast dich ursprünglich auf das leere Array bezogen, meine Rückfrage aber auf die leeren Strings in einem nicht leeren Array bezogen, und ich dann deine Aussage zu leeren Strings auf ein leeres Array bezogen.
Oder du meintest ursprünglich den leeren String, ich hab gedacht du meinst das Array, du hast gedacht ich denke du meinst den String usw...

Weil das vermutlich wieder unfreundlich aufgefasst wird: ist nicht so gemein, wirklich nicht :)

Zumindest sind das Problem in diesem Fall Zeilen, die nur aus Leerzeichen bestehen.
Das kann man wie gesagt mit einem einfachem trim vor dem Split lösen, so wie @mihe7 das auch macht, dann hätte man in diesem Fall einen leeren String, der im Code oben passend behandelt wird. Oder aber prüfen, ob ein Array mit Elementen zurück kommt.
 

Thallius

Top Contributor
Brown, du wirst mich nie verstehen so wie ich dich nie verstehen werde.... Wir beide in einem Team wäre der OberGAU. Wobei ich nicht glaube das einer von uns besser ist als der andere. Wir denken nur komplett anders, das liegt wahrscheinlich einfach an der einen Generation die uns trennt. Wobei die Jugend von heute natürlich glaubt das sie alles besser macht als wir alten es gemacht haben, das ist aber ok das war schon immer so :)
 

mrBrown

Super-Moderator
Mitarbeiter
Brown, du wirst mich nie verstehen so wie ich dich nie verstehen werde....
Mich würde allerdings wirklich interessieren, wo da jetzt das Missverständnis lag :)

Wir denken nur komplett anders, das liegt wahrscheinlich einfach an der einen Generation die uns trennt.
Die ganzen Paradigmen, Prinzipien, Pattern, Whatever, die ich so gut finde, stammen allerdings eher aus deiner Generation - zumindest trennen mich von den entsprechenden Leuten eher zwei als eine Generation ;)

Außer, du hast noch Ada Lovelace kennen gelernt, dann ist das wirklich eine Generationsfrage :p

Wobei die Jugend von heute natürlich glaubt das sie alles besser macht als wir alten es gemacht haben, das ist aber ok das war schon immer so :)
Und die ältere glauben, es sein nicht so - ist auch schon immer so ;)
 

Thallius

Top Contributor
Mich würde allerdings wirklich interessieren, wo da jetzt das Missverständnis lag :)

Ehrlich gesagt weiß ich es eben auch nicht. Ich finde nicht das ich irgend etwas falsches gesagt habe nur für deine Verhältnisse wahrscheinlich einfach nicht präzise genug.
Wenn man davon ausgeht, das der String an Position 0 des Arrays, das von Split zurück gegeben wird, eine Länge von mehr als 0 Zeichen hat, dann macht an etwas falsch. Wäre das für dich genauer gewesen?
Die ganzen Paradigmen, Prinzipien, Pattern, Whatever, die ich so gut finde, stammen allerdings eher aus deiner Generation - zumindest trennen mich von den entsprechenden Leuten eher zwei als eine Generation ;)

Also zu der Zeit als ich angefangen habe da gab es noch nicht einmal OOP. Diese ganzen Paradigmen, Prinzipen...... gab es also zu der Zeit als ich an Deinem Punkt meiner Entwicklung war sicherlich noch nicht ;)

Und die ältere glauben, es sein nicht so - ist auch schon immer so ;)

Das wollte ich damit sagen :)
 

mrBrown

Super-Moderator
Mitarbeiter
Wenn man davon ausgeht, das der String an Position 0 des Arrays, das von Split zurück gegeben wird, eine Länge von mehr als 0 Zeichen hat, dann macht an etwas falsch. Wäre das für dich genauer gewesen?
Das ist vollkommen richtig :)
(Allerdings trifft zumindest der Code oben mit split nicht die Annahme, deshalb überhaupt erst mein Einwand :) )

Also zu der Zeit als ich angefangen habe da gab es noch nicht einmal OOP. Diese ganzen Paradigmen, Prinzipen...... gab es also zu der Zeit als ich an Deinem Punkt meiner Entwicklung war sicherlich noch nicht ;)

OOP ist deutlich älter als die meisten denken ;)

Terminology invoking "objects" and "oriented" in the modern sense of object-oriented programming made its first appearance at MIT in the late 1950s and early 1960s.
Smalltalk is an object-oriented, dynamically typed reflective programming language. Smalltalk was created [...] during the 1970s.
 

Thallius

Top Contributor
OOP ist deutlich älter als die meisten denken ;)

Deine Spitzfindigkeiten machen es einem wirklich schwer dich zu mögen ;)

Natürlich hast du Recht aber es gab auch schon 100 oder gar 1000 Jahre vor Gallileo Menschen die wußten, dass die Erde keine Scheibe ist. Aber trotzdem spricht keiner drüber.
Genauso wissen wir beide, dass OOP wie wir es kennen (Klassen, Kapselung, Konstruktoren, Getter/Setter, Methoden etc,), erst mit C++ „Salonfähig“ und damit von der breiten Masse genutzt wurde. Und das war nach 1980.

Gruß

Claus
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S String index out of range Java Basics - Anfänger-Themen 11
P String index out of range Java Basics - Anfänger-Themen 12
I String index out of range Fehlermeldung Java Basics - Anfänger-Themen 4
Z Erste Schritte String index out of range Java Basics - Anfänger-Themen 2
S string index out of range - es ergibt keinen Sinn Java Basics - Anfänger-Themen 6
Ö Frage zu String index out of range: -1 Java Basics - Anfänger-Themen 12
S Substring - String index out of range Java Basics - Anfänger-Themen 11
S String index out of range: 8 at java.lang.String.substring(Unknown Source) Java Basics - Anfänger-Themen 13
H String index out of range: 0 Java Basics - Anfänger-Themen 4
StupidAttack Fehler: String index out of range:7 Java Basics - Anfänger-Themen 10
S Fehlermeldung String index out of range?? Java Basics - Anfänger-Themen 3
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
M kurze frage: Ohne index.of position von string angeben Java Basics - Anfänger-Themen 16
H wie spreche ich durch leerzeichen im string neuen index an Java Basics - Anfänger-Themen 10
krgewb String mit Datumsangabe in Long umwandeln Java Basics - Anfänger-Themen 2
D String Groß/Kleinschreibung Ignorieren Java Basics - Anfänger-Themen 4
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
J Ähnlichen String in Liste finden Java Basics - Anfänger-Themen 6
Kartoffel_1 String transformation Java Basics - Anfänger-Themen 7
H String-Operation replace() - Zeichenkette verdoppeln Java Basics - Anfänger-Themen 2
K String analysieren Java Basics - Anfänger-Themen 27
Beowend String zu Date parsen Java Basics - Anfänger-Themen 1
Beowend String auf Satzzeichen überprüfen? Java Basics - Anfänger-Themen 6
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
String in ArrayList umwandeln Java Basics - Anfänger-Themen 1
I Sass Compiler und String erhalten? Java Basics - Anfänger-Themen 7
Avalon String in Double bzw. Währung konvertieren Java Basics - Anfänger-Themen 6
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
F Arraylist<String>Ein Wort pro Zeile Java Basics - Anfänger-Themen 6
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
N String überprüfen Java Basics - Anfänger-Themen 3
E String zerlegen aus args Java Basics - Anfänger-Themen 1
M Long-Typ in String-Änderung führt zu keinem Ergebnis bei großer Zahl Java Basics - Anfänger-Themen 11
Ostkreuz String Exception Java Basics - Anfänger-Themen 8
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
J String Filter Java Basics - Anfänger-Themen 5
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Größter zusammenhängender Block gleicher Zeichen im String Java Basics - Anfänger-Themen 1
XWing Randomizer mit einem String Java Basics - Anfänger-Themen 2
D 2D Char Array into String Java Basics - Anfänger-Themen 2
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
I Zerlegen von String Java Basics - Anfänger-Themen 3
B Beliebiger String gegeben Suche Datum in String Java Basics - Anfänger-Themen 6
I String Java Basics - Anfänger-Themen 4
I API - zurückgegebener JSON String lesen und in Entity konvertieren Java Basics - Anfänger-Themen 2
H Zu langen String aufteilen - bequeme Methode? Java Basics - Anfänger-Themen 14
W String einer Textdatei in einzelne Stringobjekte pro Zeile aufteilen Java Basics - Anfänger-Themen 14
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
M Kommandozeilenparamter als EINEN String werten Java Basics - Anfänger-Themen 5
M RandomAccessFile int und String gleichzeitig in einer Datei Java Basics - Anfänger-Themen 49
M Prüfen on eine Zahl im String enthalten ist Java Basics - Anfänger-Themen 3
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5
Substring in einem String finden Java Basics - Anfänger-Themen 13
BeginnerJava String mit vorgegebener Länge und Buchstaben erzeugen/ mit Leerstellen Java Basics - Anfänger-Themen 8
I Eindeutiger String mit maximaler Anzahl an Zeichen Java Basics - Anfänger-Themen 11
H Interface Wieso "List<String> list = new ArrayList<>[…]" Java Basics - Anfänger-Themen 4
JavaBeginner22 Integer in String umwandeln Java Basics - Anfänger-Themen 7
HolyFUT JSON String in Java Object schreiben - Anführungszeichen rauskriegen? Java Basics - Anfänger-Themen 17
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
HolyFUT Input/Output Leerzeichen aus String entfernen - klappt nicht! Java Basics - Anfänger-Themen 13
viktor1 Methoden Methode schreiben static void readText (String filename) {...} zu WordHistogramSample.java Java Basics - Anfänger-Themen 13
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
G Position einer unbekannten 3-stelligen-Zahl in einem String finden Java Basics - Anfänger-Themen 15
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
X Datentypen String.equals funktioniert nicht Java Basics - Anfänger-Themen 5
Alen123 String wiederholen mit Schleifen Java Basics - Anfänger-Themen 1
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
T String splitten Java Basics - Anfänger-Themen 3
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
T Platzhalter in String? Java Basics - Anfänger-Themen 14
M String mit Variable vergleichen Java Basics - Anfänger-Themen 9
I String Kombination erstellen anhand fortlaufender Zahl (Vertragsnummer) Java Basics - Anfänger-Themen 13
Fats Waller Compiler-Fehler Kann ich einen String und die Summe zweier Char Werte mittels der println Anweisung ausgeben Java Basics - Anfänger-Themen 4
M Wie kann eine Methode (string) eine andere Methode (void) mit zufälligen int-Werten aufrufen? Java Basics - Anfänger-Themen 4
P9cman Vokale in einem String überprüfen mittels Rekursion Java Basics - Anfänger-Themen 8
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
R Ein Multidimensionales String Array initialisieren und Deklarieren Java Basics - Anfänger-Themen 2
H String Repräsentation eines Rechtecks mit Instanz-Methode Java Basics - Anfänger-Themen 8
Dorfschmied Kartesisches Produkt von zwei Liste mit Hashmaps<String,String> erstellen Java Basics - Anfänger-Themen 4
S String mit Int input vergleichen Java Basics - Anfänger-Themen 5
C String/Char-API Java Basics - Anfänger-Themen 13
U Char zu einem String machen Java Basics - Anfänger-Themen 1
B Anzahl Nullen uns Einsen in String ermitteln Java Basics - Anfänger-Themen 3
T Leerzeichen im String entfernen Java Basics - Anfänger-Themen 6
Jose05 Nullpointerexception bei Umwandlung von String zu int Java Basics - Anfänger-Themen 2
O Ich habe einen String und soll mit matches schauen, ob ein Buchstabe zu einer geraden ANzahl im String vorkommt, wie soll das gehen? Java Basics - Anfänger-Themen 7
M String beim einlesen formatieren Java Basics - Anfänger-Themen 12
N null in String replacen Java Basics - Anfänger-Themen 16
R Compiler-Fehler JTable mit XML befüllen | The constructor JTable(Object[], String[]) is undefined Java Basics - Anfänger-Themen 10
M Eclipse kennt keine String Klasse mehr Java Basics - Anfänger-Themen 1
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
D String mit int multiplizieren? Java Basics - Anfänger-Themen 16
H Überprüfen ob String Array leer ist Java Basics - Anfänger-Themen 4
A Korrigierte <String> Liste zurückgeben Java Basics - Anfänger-Themen 22
C In String, Buchstaben ersetzen durch andere Buchstaben Java Basics - Anfänger-Themen 26
Poppigescorn String mit mehreren Wörtern füllen? Java Basics - Anfänger-Themen 4
I String Expression mit Java validieren (true / false) Java Basics - Anfänger-Themen 34

Ähnliche Java Themen

Neue Themen


Oben