Как избежать StringIndexOutOfBoundsException, когда char не имеет значения?

Извините, если название не имело смысла, но я не знал, как его сформулировать.

проблема:

Я делаю множественный выбор викторины, которая получает либо a, b, c или d от пользователя. Это не проблема, если они делают, как им говорят, однако, если они ничего не вводят и просто нажмите enter, я получаю StringIndexOutOfBoundsException. Я понимаю, почему это происходит, но я новичок в Java и не могу придумать способ, чтобы исправить это.

что у меня так далеко:

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

конечно, программа никогда не пройдет вторую строку кода, если пользователь ничего не вводит, потому что вы не можете взять значение charAt(0) пустой строки. То, что я ищу, - это то, что проверит, является ли ответ нулевым, и если да, спросите, вернитесь и снова задайте вопрос пользователю.

заранее спасибо за любые ответы.

5 ответов


вы можете использовать цикл do-while. Просто замените

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

С

String line;

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

response = line.charAt(0);

это будет продолжать вызывать input.nextLine() столько раз, сколько пользователь вводит пустую строку, но как только они вводят непустую строку, она будет продолжаться и устанавливать response равно первому символу этой непустой строки. Если вы хотите повторно запросить у пользователя ответ, вы можете добавить приглашение во внутреннюю часть цикла. Если вы хотите проверить, что пользователь ввел букву a - d, вы можете также добавьте эту логику в условие цикла.


либо обработать исключение(StringIndexOutOfBoundsException) или сломать это утверждение

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

as

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

Обработка Исключений:

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

просто:

  • получить ввод изначально в виде строки и поместить его во временную строковую переменную.
  • затем проверьте длину строки.
  • затем, если > 0 извлеките первый символ и используйте его.

кроме того, @HovercraftFullOfEels ' (совершенно правильный) ответ, я хотел бы отметить, что вы можете "поймать" эти исключения. Например:

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
}

т. е. если StringIndexOutOfBoundsException встречается при выполнении try-блок, код catch-блок будет выполнен. Вы можете узнать больше о ловле и обработке исключений здесь.


StringIndexOutofBoundException также произойдет в следующей ситуации.

  1. поиск строки, которая недоступна
  2. соответствует строке, которая недоступна

    например:

    List ans=новый ArrayList ();
    temp= "and";
    String arr []={"android","jellybean","kitkat","ax"};
    for (int index=0; index если(темп.length () если(темп.equlsIgnoreCase ((String)arr[`index].подпоследовательность (0, temp.length ())));
    ответ.add (arr[index]);

следующий код необходим, чтобы избежать indexoutofboundexception

if(temp.length ()

потому что здесь мы проверяем, что длина строки src равна или больше temp . если длина строки src меньше, чем будет через "arrayindexoutof boundexception"