2014-12-14 2 views
-1

Привет Я новичок с Java, и я пытаюсь написать небольшую простую текстовую версию для одной домашней работы, это вот код:Java String Index Out of Bound (String Index out of Range) в строке 150

import java.util.* ; 

class Quiz 
{ 
    public static void main(String[] not_in_use) 
    {  
     Scanner keyboard = new Scanner(System.in) ; 

     int money = 0; 
     char answer; 
    boolean quit = false; 
    int id = 0; 
    int id1 = 0; 
    System.out.print("\nWelcome to Haluatko Miljonääriksi?." 
        + "\nAn interactive quiz game about Finland by Khoa \"Kazkyu\" Nguyen.\n" 
        + "\nYou are given 15 multiple-choice questions." 
        + "\nEarn money and move on by choosing the right answer, final price is 1 million Euros." 
        + "\nAnswer a question by typing A, B, C, D on your keyboard." 
        + "\nType in \"save\" to use Lifesaver." 
        + "\nQuit the game and keep your earned money by typing \"exit\"." 
        + "\nYou still win with half the money you earned if you answer wrong." 
        + "\n\nPress Enter to begin: "); 

    keyboard.nextLine();     
    if ((id <= 15) && (quit == false)) 
    { 
    System.out.print("\nWhat is the name of Finland in Finnish?:\n" 
        +"\nA. Suomi" 
        +"\nB. Soumi" 
        +"\nC. Suomea" 
        +"\nD. Soumea" 
        +"\n\n"); 
    answer = keyboard.nextLine().charAt(0); 
     while (!((answer == 'A') || 
      (answer == 'a') || (answer == 'B') || 
      (answer == 'b') || (answer == 'C') || 
      (answer == 'c') || (answer == 'D') || 
      (answer == 'd') || (answer == 'E') || 
      (answer == 'e') || (answer == 'S') || (answer == 's'))) 
    { 
    System.out.print("\nWrong input A,B,C,D or Exit or Save only.\n"); 
      answer = keyboard.nextLine().charAt(0) ; 
    } 
      if ((answer == 'A') || (answer == 'a')) 
       { 
       money = money + 200; 
       id = id + 1; 
       System.out.print ("\nCorrected, you earned " + money + " Euros\n"); 
       } 
      else if ((answer == 'B') || (answer == 'b') || (answer == 'C') || (answer == 'c') 
      || (answer == 'D') || (answer == 'd')) 
       { 
       System.out.print ("\nWrong, you lose, no money for you\n" 
            +"Game over, good luck next time\n"); 
       quit = true; 
       } 
      else if ((answer == 'E') || (answer == 'e')) 
       { 
       System.out.print ("\nYou choose to quit, your money is: " + money + " Euros" 
            +"\nGood luck next time\n"); 
       quit = true;      
       } 

      else if ((answer == 'S') || (answer == 's')) 
       { 
       id1 = id1 + 1; 
       System.out.print ("\nPlease choose your life saver:" 
            +"\nType 1 for \"Skip and get point\"" 
            +"\nType 2 for \"Surf Wikipedia for answer\", Warning: Very Random" 
            +"\nType 3 for \"Asked Jere, Michal, Jaska, Marios for help\", Warning: Very Random" 
            +"\n\n"); 
          int choice = keyboard.nextInt(); 
           if (choice == 1) 
           { 
           money = money + 200; 
           id = id + 1; 
           answer 
           System.out.print ("\nQuestion Skipped, earn " + money + " Euros.\n"); 
           } 
           if (choice == 2) 
           { 
           Random rand = new Random(); 
           int randomNum = rand.nextInt((4 - 1) + 1) + 1; 
           if (randomNum == 1) 
           { 
            money = money + 200; 
            System.out.print ("\nWiki said answer is A, right answer, "); 
           } 
           else if (randomNum == 2) 
           { 
            System.out.print ("\nWiki said answer is B ,wrong answer, Game over.\n" 
                +"You earned " + money + " Euros.\n"); 
            quit = true; 
           } 
           else if (randomNum == 3) 
           { 
            System.out.print ("\nWiki said answer is C ,wrong answer, Game over.\n" 
                +"You earned " + money + " Euros.\n"); 
            quit = true; 
           } 
           else if (randomNum == 4) 
           { 
            System.out.print ("\nWiki said answer is D ,wrong answer, Game over.\n" 
                +"You earned " + money + " Euros.\n"); 
            quit = true; 
           } 
           } 
           if (choice == 3) 
           { 
           Random rand1 = new Random(); 
           int randomNum1 = rand1.nextInt((4 - 1) + 1) + 1; 
            if (randomNum1 == 1) 
            { 
            money = money + 200; 
            System.out.print ("\nYou asked Jere and got the answer: A.\n" 
                +"Right answer, " + money + " Euros.\n"); 
            } 
            if (randomNum1 == 2) 
            { 
            money = money + 200; 
            System.out.print ("\nYou asked Michal and got the answer: A.\n" 
                +"Right answer, " + money + " Euros.\n"); 
            } 
            if (randomNum1 == 3) 
            { 
            System.out.print ("\nYou called Jaska and recieved a \"Whatever, I like milk, why not\" for an answer." 
                + "\nYou answered \"Whatever, I like milk, why not\", Wrong answer." 
                + "\nGame over, You earn " + money + " Euro.\n"); 
            quit = true; 
            } 
            if (randomNum1 == 4) 
            { 
            System.out.print ("You called Marios and he gave you this answer:\n" 
                + "\nAyy Lmao, get rekt m8, inb4 4chan raid." 
                + "\nYou don't know what the fuck it mean." 
                + "\nSo you quit with " + money + " Euros in your pocket.\n"); 
            quit = true; 
            } 
           } 

       } 
    } 
    if ((id <= 15) && (quit == false)) 
    { 
    System.out.print("\nWhen is the Finnish's Independence Day?:\n" 
        +"\nA. 12th of December" 
        +"\nB. 25th of December" 
        +"\nC. 6th of December" 
        +"\nD. 31th of December" 
        +"\n\n"); 
    ****\\line 150 THIS IS LINE 150 WHERE IT HAPPEN\\ 
     answer = keyboard.nextLine().charAt(0);**** 
     while (!((answer == 'A') || 
      (answer == 'a') || (answer == 'B') || 
      (answer == 'b') || (answer == 'C') || 
      (answer == 'c') || (answer == 'D') || 
      (answer == 'd') || (answer == 'E') || 
      (answer == 'e') || (answer == 'S') || (answer == 's'))) 
    { 
    System.out.print("\nWrong input A,B,C,D or Exit or Save only.\n"); 
      answer = keyboard.nextLine().charAt(0) ; 
    } 
      if ((answer == 'C') || (answer == 'c')) 
       { 
       money = money + 250; 
       id = id + 1; 
       System.out.print ("\nCorrected, you earned " + money + " Euros\n"); 
       } 
      else if ((answer == 'B') || (answer == 'b') || (answer == 'A') || (answer == 'a') 
      || (answer == 'D') || (answer == 'd')) 
       { 
       money = money/2; 
       System.out.print ("\nWrong, you lose, your money is " + money + " Euros\n" 
            +"Game over, good luck next time\n"); 
       quit = true; 
       } 
      else if ((answer == 'E') || (answer == 'e')) 
       { 
       System.out.print ("\nYou choose to quit, your money is: " + money + " Euros" 
            +"\nGood luck next time\n"); 
       quit = true;      
       } 

      else if ((answer == 'S') || (answer == 's')) 
       { 
       id1 = id1 + 1; 
       System.out.print ("\nPlease choose your life saver:" 
            +"\nType 1 for \"Skip and get point\"" 
            +"\nType 2 for \"Surf Wikipedia for answer\", Warning: Very Random" 
            +"\nType 3 for \"Asked Jere, Michal, Jaska, Marios for help\", Warning: Very Random" 
            +"\n\n"); 
          int choice = keyboard.nextInt(); 
           if (choice == 1) 
           { 
           money = money + 250; 
           id = id + 1; 
           System.out.print ("\nQuestion Skipped, earn " + money + " Euros.\n"); 
           } 
           if (choice == 2) 
           { 
           Random rand = new Random(); 
           int randomNum = rand.nextInt((4 - 1) + 1) + 1; 
           if (randomNum == 1) 
           { 
            money = money + 250; 
            System.out.print ("\nWiki said answer is C, right answer, "); 
           } 
           else if (randomNum == 2) 
           { 
            System.out.print ("\nWiki said answer is B ,wrong answer, Game over.\n" 
                +"You earned " + money + " Euros.\n"); 
            quit = true; 
           } 
           else if (randomNum == 3) 
           { 
            System.out.print ("\nWiki said answer is A ,wrong answer, Game over.\n" 
                +"You earned " + money + " Euros.\n"); 
            quit = true; 
           } 
           else if (randomNum == 4) 
           { 
            System.out.print ("\nWiki said answer is D ,wrong answer, Game over.\n" 
                +"You earned " + money + "Euros.\n"); 
            quit = true; 
           } 
           } 
           if (choice == 3) 
           { 
           Random rand1 = new Random(); 
           int randomNum1 = rand1.nextInt((4 - 1) + 1) + 1; 
            if (randomNum1 == 1) 
            { 
            money = money + 200; 
            System.out.print ("\nYou asked Jere and got the answer: C.\n" 
                +"Right answer, " + money + " Euros.\n"); 
            } 
            if (randomNum1 == 2) 
            { 
            money = money + 200; 
            System.out.print ("\nYou asked Michal and got the answer: C.\n" 
                +"Right answer, " + money + " Euros.\n"); 
            } 
            if (randomNum1 == 3) 
            { 
            System.out.print ("\nYou called Jaska and recieved a \"Whatever, I like milk, why not\" for an answer." 
                + "\nYou answered \"Whatever, I like milk, why not\", Wrong answer." 
                + "\nGame over, You earn " + money + " Euro.\n"); 
            quit = true; 
            } 
            if (randomNum1 == 4) 
            { 
            System.out.print ("You called Marios and he gave you this answer:\n" 
                + "\nAyy Lmao, get rekt m8, inb4 4chan raid." 
                + "\nYou don't know what the fuck it mean." 
                + "\nSo you quit with " + money + " Euros in your pocket.\n"); 
            quit = true; 
            } 
           } 

       }     
    }  

} }

Все, кажется, работает нормально, за исключением, когда я печатаю с использовать спасатель, после выбора 1, он пропустит этот вопрос, как я хочу, чтобы он, но он также дает мне индекс из связанной ошибки, и он говорит, что это на линии 150, я так запутался в этом, все остальные работают нормально.

Пожалуйста, помогите мне, спасибо

+0

Можете ли вы опубликовать stacktrace и указать место, где возникает исключение? – Marv

+2

Вы должны указать _where_, исключение происходит. Никто не хочет просматривать старую домашнюю свадьбу на 250 строк. – August

+0

Что такое линия 150? Очень много кода для просмотра. –

ответ

0

Проблема в том, что keyboard.nextLine() - пустая строка, поэтому она выдает исключение.

Причина, по которой она пуста, состоит в том, что после считывания целого числа от пользователя в буфере все еще есть символ новой строки, что вызывает проблемы.

Самый простой способ исправить это (проверено), чтобы получить целое число от пользователя следующим образом:

System.out.print("\nPlease choose your life saver:" 
      +"\nType 1 for \"Skip and get point\"" 
      +"\nType 2 for \"Surf Wikipedia for answer\", Warning: Very Random" 
      +"\nType 3 for \"Asked Jere, Michal, Jaska, Marios for help\", Warning: Very Random" 
      +"\n\n"); 

      //Modify this line right here like so. 
      int choice = Integer.parseInt(keyboard.nextLine()); 

Это остановит символ новой строки из находящихся в буфере, который решает все проблемы.

0

keyboard.nextLine() возвращает пустую строку (строку с 0 символов -. "" Вы можете проверить это, выполнив System.out.println(keyboard.nextLine().length());

1

Если answer = keyboard.nextLine().charAt(0) бросает StringIndexOutOfBoundsException единственной возможностью является то, что keyboard.nextLine() возвращает пустую строку.

+0

Я не уверен, что могу понять это, так как я ноб, вы можете быть более конкретным с инструкцией? Например, я сказал, что каждый другой вход работает нормально, за исключением случаев, когда я вхожу в s, а затем введите 1 –

+0

'keyboard.nextLine()' возвращает пустую строку ('' ''). Вызов 'charAt (0)' на пустую строку (так же: '" ".charAt (0)') выдает 'StringIndexOutOfBoundsException'. – Marv

0

Когда вы используете спасательный жилет, ввода клавиатуры нет, поэтому keyboard.nextLine() - это просто пустая строка. Поскольку она пуста, она h как никакой символ в индексе 0. Вы должны реализовать некоторую логику, которая пропускает сканирование для входной части keyborad при использовании спасателя.

0

в варианте 1 у вас есть

answer 

не точка с запятой или что он должен сказать вам об этом в вашей compliler я понятия не имею, почему это не произошло, оно ошибка после этого naturaly.