2012-10-22 10 views
7

Przepraszam, jeśli tytuł nie miał sensu, ale nie wiedziałem, jak to wymówić.Jak uniknąć wyjątku StringIndexOutOfBoundsException, gdy char nie ma wartości?

Problem:

Robię wielokrotnego wyboru quiz, który pobiera A, B, C lub D z użytkownikiem. Nie ma problemu, jeśli robią tak, jak im się mówi, jednak jeśli nic nie wpisują i po prostu wciskam enter, otrzymuję wyjątek StringIndexOutOfBoundsException. Rozumiem, dlaczego tak się dzieje, ale jestem nowy w Javie i nie mogę wymyślić sposobu, aby to naprawić.

Co mam tak daleko:

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"); 
    } 

Oczywiście program nigdy nie będzie go obok drugiej linii kodu, jeśli użytkownik wpisze nic, ponieważ nie można przyjąć charAt (0) wartość pusty ciąg. To, czego szukam, to coś, co sprawdzi, czy odpowiedź jest pusta, a jeśli tak, zapytaj wróć i ponownie zadaj pytanie użytkownikowi.

Z góry dziękuję za wszelkie odpowiedzi.

+1

Zakładam, że 'input' jest typu' java.util.Scanner'. Jeśli tak jest, wówczas zwracałby pusty ciąg _ zamiast "null". – DaoWen

+0

Tak, będzie to pusty ciąg. Dlatego 'input.nextLine(). CharAt (0);' wygeneruje StringIndexOutOBoundsException – jlordo

Odpowiedz

6

Można użyć do-while . Wystarczy zastąpić

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

z

String line; 

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

response = line.charAt(0); 

ten będzie nadal nazywają input.nextLine() tyle razy, ile użytkownik wchodzi do pustego wiersza, ale jak tylko wprowadzić zakaz pusty wiersz będzie kontynuować i ustawić response jest równy pierwszemu znakowi tej niepustej linii. Jeśli chcesz ponownie poprosić użytkownika o odpowiedź, możesz dodać monit do wnętrza pętli. Jeśli chcesz sprawdzić, czy użytkownik wprowadził literę a-d, możesz również dodać tę logikę do stanu pętli.

2

Proste:

  • Get wejście początkowo jako String, i umieścić go w zmiennej String tymczasowego.
  • Następnie sprawdź długość łańcucha.
  • następnie jeśli> 0 wyodrębnij pierwszy znak i użyj go.
3

Albo obsłużyć wyjątek (StringIndexOutOfBoundsException) lub przerwać ten komunikat

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

jako

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

Obsługa wyjątków:

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

Czy 'input.nextLine()' może mieć wartość 'null'? – arshajii

+0

@ A.R.S .: W moim zwyczaju przed sprawdzeniem długości wprowadzono zerową kontrolę. Oddalony. –

2

Oprócz tego, że odpowiedź @HovercraftFullOfEels (jest całkowicie poprawna), chciałbym zauważyć, że można "złapać" te wyjątki. Np

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 
} 

to znaczy jeśli StringIndexOutOfBoundsException napotkano podczas wykonywania try -blok kod w catch -blok zostanie wykonany. Więcej informacji na temat wyjątków dotyczących chwytania i obsługi można znaleźć na stronie here.

0

Wyjątek StringIndexOutofBoundException wystąpi również w następujących sytuacjach.

  1. wyszukiwania ciąg, który nie jest dostępny
  2. meczu z łańcucha, który nie jest dostępny

    dla Ex:

    listy ans = new ArrayList();
    temp = "i";
    String arr [] = {"android", "jellybean", "kitkat", "ax"};
    dla (int wskaźnik = 0; indeksu < arr.Length; indeksu
    ++) if (temp.length (ARR) < = [indeks] .length())
    if (temp.equlsIgnoreCase ((ciąg) ARR [ `` index] .subSequence (0, temp.length())));
    ans.add (arr [indeks]);

następujące jest potrzebny, aby uniknąć indexoutofboundexception

if (temp.length (ARR) < = [indeks] .length())

ponieważ mamy tu cheking długość Src ciąg jest równy lub większy niż temp. jeśli długość łańcucha src jest mniejsza niż przez "arrayindexoutof boundexception"

Powiązane problemy