Индекс 0 выходит за пределы для длины 0 для игры «Виселица»

Почему на консоли написано Index 0 out of bounds for length 0?
В моем методе сказано CharacterSearch().

Вот мой код. Кстати код Hangman Game. Я новичок в Java и не знаю всех включенных библиотек.

package besingaPi_LE_3_2;

import java.util.Scanner;

public class GameHangman {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int miss = 0; 
        String choice1;
        String temp;
        
        String[] words = {"giraffe", "hipopotamus", "gorilla", "peacock", "armadillo"};

        int choice;
        //do {
            mainMenu();
            choice = input.nextInt();
            System.out.println();
            if (choice == 1){
                
                String wordRandom = Randomizer(words);
//              char[] letters = new char[wordRandom.length()];
                String mute  = secretWord(wordRandom);
                temp = mute;
//              char c = wordRandom.charAt(3);
//              System.out.println(c);
                System.out.println(wordRandom);
                System.out.println("Note: use only small character/s");
                
                while(!mute.equals(wordRandom)) {
                    System.out.print("(Guess) Enter a letter in word " + mute + " > ");         
                    choice1 = input.nextLine();
//                  char letter = choice1.charAt(0);
                    mute = CharacterSearch(wordRandom, mute, choice1);

                    if (temp.equals(mute)) {
                        miss++;
                    }
                    temp = mute;
    
                }
                System.out.println("The word is " + wordRandom + "." + " You missed " + miss + " time.");
            }
            else if (choice == 0) {
                System.out.println("Thank you!!");
                return;
            }

    }
    public static void mainMenu() {
        System.out.println("Welcome to Hangman");  
        System.out.println("[1]START\n[0]EXIT"); 
        System.out.print("Please input your choice: ");
        return; 
    }
    public static String CharacterSearch(String word, String muted, String key) {
        StringBuilder update = new StringBuilder(muted);
        int i;
        for(i = 0; i < word.length(); i++) {
            if (word.charAt(i)  == key.charAt(0)) {
                update.setCharAt(i,key.charAt(0));
            }
        }
        
        muted = update.toString();
        return muted;
    }
    public static String secretWord(String word) {
        String temp = "";
        for(int i = 0; i < word.length(); i++) {
            temp += "*";
        }
        return temp;
    }
    
    public static String Randomizer(String[] words) {
        int rand = (int)(Math.random() * words.length);
        String word = words[rand];
        return word;
    }
}

Я пробовал так много вещей, но всегда было написано «Индекс вне границ».

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
54
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Ошибка «Индекс 0 вне границ для длины 0», с которой вы столкнулись, вероятно, связана с вызовом input.nextLine() после чтения целочисленного ввода с использованием input.nextInt(). Когда вы нажимаете Enter после ввода целого числа, input.nextLine() считывает символ новой строки ('\n'), который не был уловлен вашим кодом.

Чтобы исправить это, вы можете добавить дополнительный input.nextLine() после чтения целого числа, чтобы использовать символ новой строки. Измените свой код следующим образом:

choice = input.nextInt();
input.nextLine();
System.out.println();
if (choice == 1) {
    // ...
}

Это должно предотвратить ошибку сейчас. Не волнуйтесь, я постоянно совершал эту ошибку.

Спасибо за это, мой код теперь работает. Но один вопрос, если я выберу System.out.println(); часть, я также выберу input.nextLine();

Piolo Pascual Besinga 17.09.2023 07:30

@PioloPascualBesinga Да, если вы решите удалить System.out.println(); строку, вы также можете удалить соответствующий input.nextLine(). Кроме того, если ваш код теперь работает, пожалуйста, примите этот ответ, чтобы другие люди знали, что этот вопрос решен.

Dolfinwu 17.09.2023 07:59

Готово, спасибо.

Piolo Pascual Besinga 17.09.2023 09:30

Возможно, вы можете добавить System.out.println прямо перед проблемным кодом, проверить содержимое строкового слова и ключа и закомментировать цикл for. Таким образом, вы можете проверить, соответствуют ли слова и ключевые строки вашим ожиданиям.

«... почему консоль сказала, что индекс 0 выходит за пределы для длины 0. ...»

Значение choice1 пусто.

Вызов input.nextLine() после вызова input.nextInt() просто переместит курсор сканера на следующую строку.

Например, представьте, что вы попросили пользователя ввести 3 числа в одной строке.
Вы должны использовать nextInt 3 раза, а затем один раз nextLine, чтобы перейти к следующей строке.

Вот позиция курсора для каждого вызова.

Enter 3 values:  100 200 300
                  ^   ^   ^
^                 |   |   |
|         nextInt 1   |   nextInt 3
|                     |
nextLine          nextInt 2

Вызовите nextLine после назначения выбора.

choice = input.nextInt();
input.nextLine();

Вот пример вывода.
Слово «Гиппопотам» тоже написано неправильно.

Welcome to Hangman
[1]START
[0]EXIT
Please input your choice: 1

hipopotamus
Note: use only small character/s
(Guess) Enter a letter in word *********** > h
(Guess) Enter a letter in word h********** > i
(Guess) Enter a letter in word hi********* > p
(Guess) Enter a letter in word hip*p****** > o
(Guess) Enter a letter in word hipopo***** > t
(Guess) Enter a letter in word hipopot**** > a
(Guess) Enter a letter in word hipopota*** > m
(Guess) Enter a letter in word hipopotam** > u
(Guess) Enter a letter in word hipopotamu* > s
The word is hipopotamus. You missed 0 time.

Другие вопросы по теме