首页 > 解决方案 > 尝试从 ArrayList 获取字符串时出现 IndexOutOfBoundsException

问题描述

所以我正在尝试创建一个小型刽子手迷你游戏。不幸的是,我一直收到同样的错误。我尝试过两次重做游戏,但似乎仍然无法正确完成。我确定这只是一些逻辑错误或其他东西。

我对 Java 还是比较陌生,所以任何帮助将不胜感激。

我已将程序分为三个类。一个用于 Hangman 对象,一个用于包含所述对象的数组,一个用于使用这些对象的数组。以下三个部分是游戏的片段。

第一类:刽子手

package hangman2;

import java.util.*;
import java.io.*;

public class Hangman {

    private ArrayList<String> words = new ArrayList<>();
    private int diff;

    public Hangman(String fileName, int difficulty) {

        diff = difficulty;
        //easy = 0; medium = 1; hard = 2

        try {
            Scanner scanFile  = new Scanner(new File(fileName));

            while(scanFile.hasNext()) {

                String line = scanFile.nextLine();
                Scanner scanLine = new Scanner(line);
                String tempWord = scanLine.next();

                words.add(tempWord);
            }
        }
        catch (FileNotFoundException e) {
            System.out.println("File not found\n" + e);
        }
    }

    //Gets
    public ArrayList<String> getWords() { return words; }
    public int getDifficulty() { return diff; }

    //Sets
    public void addWord(String word) { words.add(word); }
}

第 2 类:HangmanArray

package hangman2;

import java.util.ArrayList;
import javax.swing.JOptionPane;

public class HangmanArray {

    private Hangman easyHangman;
    private Hangman mediumHangman;
    private Hangman hardHangman;

    public HangmanArray() {

        easyHangman = new Hangman("easy.txt", 0);
        mediumHangman = new Hangman("medium.txt", 1);
        hardHangman = new Hangman("hard.txt", 2);
    }

    public String getRandomWord() {

        Hangman workingHangman = chooseDifficulty();
        int max = workingHangman.getWords().size();
        int randIndex = (int) (Math.random() * max);

        return workingHangman.getWords().get(randIndex);
    }

    private Hangman chooseDifficulty() {

        int chosenDifficulty = Integer.parseInt(JOptionPane.showInputDialog("Choose difficulty level\n"
                + "1: Novice\n2: Intermediate\n3: Expert"));
        Hangman retHangman = null;

        switch(chosenDifficulty) {

            case 1: retHangman = easyHangman; break;
            case 2: retHangman = mediumHangman; break;
            case 3: retHangman = mediumHangman; break;
        }

        if (retHangman == null) {

            System.out.println("Chosen difficulty not within range of [1;3]\nexiting");
            System.exit(0);
        }

        return retHangman;
    }
}

第 3 类:HangmanUI

package hangman2;

public class HangmanUI {

    public static void main(String[] args) {

        HangmanArray hangmanArray = new HangmanArray();
        System.out.println(hangmanArray.getRandomWord());
    }
}

The error appears to be coming from line 25 of HangmanArray when difficulty 2 or 3 is selected:

return workingHangman.getWords().get(randIndex);

任何帮助表示赞赏。

标签: javaarraylist

解决方案


您应该检查是否max为 0,如果是,则返回null或空字符串,然后处理这种特殊情况。
我使用Random.nextInt()而不是int randIndex = (int) (Math.random() * max);

返回一个伪随机、均匀分布的 int 值,介于 0(包括)和指定值(不包括)之间,取自该随机数生成器的序列。nextInt 的一般约定是伪随机生成并返回指定范围内的一个 int 值。所有绑定的可能 int 值都以(大约)相等的概率产生

请记住,最后一个元素的索引是size()-1

public String getRandomWord() {

    Hangman workingHangman = chooseDifficulty();
    int max = workingHangman.getWords().size();
    if (max == 0) {
         return "";
    }

    int randIndex = new Random().nextInt(max); // returns an integer between 0 and max-1

    return workingHangman.getWords().get(randIndex);
}  

您还应该使用try-with-resources来确保您正在使用的资源在您完成后关闭。

public Hangman(String fileName, int difficulty) {

    diff = difficulty;
    //easy = 0; medium = 1; hard = 2

    try (Scanner scanFile  = new Scanner(new File(fileName))) {

        while(scanFile.hasNext()) {

            String line = scanFile.nextLine();
            Scanner scanLine = new Scanner(line);
            String tempWord = scanLine.next();

            words.add(tempWord);
        }
    }
    catch (FileNotFoundException e) {
        System.out.println("File not found\n" + e);
    }
}

最后,我建议使用调试器来了解您在每个 Hangman 中添加了什么。


推荐阅读