2012-10-22 9 views
7

Tut mir leid, wenn der Titel keinen Sinn ergeben hat, aber ich wusste nicht, wie ich ihn formulieren soll.Wie vermeide ich StringIndexOutOfBoundsException, wenn Char keinen Wert hat?

Das Problem:

Ich mache ein Quiz-Spiel Multiple-Choice, die entweder a, b, c oder d von dem Benutzer erhält. Dies ist kein Problem, wenn sie tun, was ihnen gesagt wird, aber wenn sie nichts tippen und einfach Enter drücken, bekomme ich eine StringIndexOutOfBoundsException. Ich verstehe, warum das passiert, aber ich bin neu in Java und kann mir keinen Weg vorstellen, es zu reparieren.

Was ich habe, so weit:

System.out.println("Enter the Answer."); 

    response = input.nextLine().charAt(0); 

    if(response == 'a') 
    { 
      System.out.println("Correct"); 
    } 

    else if(response == 'b' || response == 'c' || response == 'd') 
    { 
     System.out.println("Wrong"); 
    } 
    else 
    { 
     System.out.println("Invalid"); 
    } 

Natürlich ist das Programm wird es nie die zweite Zeile des Codes machen vorbei, wenn der Benutzer nichts, weil Sie nicht den charAt nehmen (0) Wert eine leere Zeichenfolge. Was ich suche, ist etwas, das prüft, ob die Antwort null ist, und wenn ja, frage zurück und stelle die Frage erneut an den Benutzer.

Vielen Dank im Voraus für alle Antworten.

+1

Ich nehme an, 'Eingang' ist vom Typ' java.util.Scanner'. Wenn dies der Fall ist, würde es tatsächlich eine _empty-Zeichenkette_ anstatt "null" zurückgeben. – DaoWen

+0

Ja, es wird der leere String sein. Deshalb wird 'input.nextLine(). CharAt (0);' eine StringIndexOutOBoundsException erzeugen – jlordo

Antwort

6

Sie eine do-while-Schleife verwenden können . Nur

ersetzen
response = input.nextLine().charAt(0); 

mit

String line; 

do { 
    line = input.nextLine(); 
} while (line.length() < 1); 

response = line.charAt(0); 

Dies wird auch weiterhin input.nextLine() so oft aufrufen, wenn der Benutzer eine Leerzeile eingibt, aber sobald sie eine nicht-leere Zeile eingeben, wird es weiter und setzen response entspricht dem ersten Zeichen dieser nicht leeren Zeile. Wenn Sie den Benutzer erneut zur Eingabe der Antwort auffordern möchten, können Sie die Eingabeaufforderung innerhalb der Schleife hinzufügen. Wenn Sie überprüfen möchten, ob der Benutzer einen Buchstaben a-d eingegeben hat, können Sie diese Logik auch zur Schleifenbedingung hinzufügen.

2

Ganz einfach:

  • Holen Sie sich das Eingang zunächst als String, und steckt es in ein temporäres String-Variable.
  • Überprüfen Sie dann die Länge der Zeichenfolge.
  • dann, wenn> 0 das erste Zeichen extrahieren und verwenden Sie es.
3

Entweder behandeln die Ausnahme (StringIndexOutOfBoundsException) oder brechen diese Aussage

response = input.nextLine().charAt(0); 

als

String line = input.nextLine(); 
    if(line.length()>0){ 
     response = line.charAt(0); 
    } 

Ausnahmebehandlung:

try{ 
     response = input.nextLine().charAt(0); 
    }catch(StringIndexOutOfBoundsException siobe){ 
     System.out.println("invalid input"); 
    } 
+0

Kann 'input.nextLine()' jemals 'null' sein? – arshajii

+0

@ A.R.S .: Es ist meine Gewohnheit geworden, Null-Check vor der Längenprüfung zu setzen. Entfernt. –

2

Zusätzlich @HovercraftFullOfEels '(perfekt gültige) Antwort, möchte ich darauf hinweisen, dass Sie diese Ausnahmen "fangen" können. Zum Beispiel:

try { 
    response = input.nextLine().charAt(0); 
} catch (StringIndexOutOfBoundsException e) { 
    System.out.println("You didn't enter a valid input!"); 
    // or do anything else to hander invalid input 
} 

das heißt, wenn ein StringIndexOutOfBoundsException angetroffen wird, wenn die try -block Ausführung der Code in dem catch -block ausgeführt. Sie können mehr über das Abfangen und Behandeln von Ausnahmen lesen here.

0

StringIndexOutofBoundException wird auch in der folgenden Situation auftreten.

  1. einen String Suche, die
  2. Spiel mit der Zeichenfolge nicht verfügbar ist, die

    für ex nicht verfügbar:

    Liste ans = new Arraylist();
    temp = "und";
    String arr [] = {"android", "jellybean", "kitkat", "axe"};
    for (int index = 0; index < arr.length; index ++)
    if (temp.length() = < arr [index] .length())
    if (temp.equlsIgnoreCase ((String) arr [ `` index] .subSequence (0, temp.length())));
    ans.add (arr [Index]);

wird der folgende Code erforderlich indexoutofboundexception

if (temp.length() < = arr [index] .length())

, weil wir hier sind cheking die Länge von src zu vermeiden Zeichenfolge ist gleich oder größer als Temp. Wenn die src-String-Länge ist kleiner als es durch "Arrayindexoutof boundexception"

Verwandte Themen