Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试从ArrayList获取字符串时发生IndexOutOfBoundsException_Java_Arraylist - Fatal编程技术网

Java 尝试从ArrayList获取字符串时发生IndexOutOfBoundsException

Java 尝试从ArrayList获取字符串时发生IndexOutOfBoundsException,java,arraylist,Java,Arraylist,所以我想制作一个小的刽子手迷你游戏。不幸的是,我一直收到相同的错误。我已经尝试过两次重做游戏,但似乎仍然无法正确完成。我敢肯定这只是一些逻辑错误或别的什么 我对Java还比较陌生,所以如果有任何帮助,我将不胜感激 我把这个项目分成三个班。一个用于Hangman对象,一个用于包含所述对象的阵列,一个用于使用这些对象的阵列。下面三个部分是游戏的一个片段 第一类:刽子手 package hangman2; import java.util.*; import java.io.*; public c

所以我想制作一个小的刽子手迷你游戏。不幸的是,我一直收到相同的错误。我已经尝试过两次重做游戏,但似乎仍然无法正确完成。我敢肯定这只是一些逻辑错误或别的什么

我对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); }
}
第三类:汉曼努伊

package hangman2;

public class HangmanUI {

    public static void main(String[] args) {

        HangmanArray hangmanArray = new HangmanArray();
        System.out.println(hangmanArray.getRandomWord());
    }
}
当选择难度2或3时,错误似乎来自HangmanArray的第25行:

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

非常感谢您的帮助。

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

返回从该随机数生成器的序列中提取的0(包含)和指定值(排除)之间的伪随机、均匀分布的int值。nextInt的一般约定是伪随机生成并返回指定范围内的一个int值。所有可能的有界int值以(近似)相等的概率产生

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

您还应该使用,以确保您使用的资源在完成调度后关闭

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

最后,我建议使用,以便了解每个刽子手的具体错误信息。

确切的错误信息是什么?另外:你说问题可能在哪一行很好,但是SO中没有行号,所以我们仍然不知道你说的是哪一行。请不要忘记使用
scanFile.close()在Hangman类的构造函数中关闭流
finally
子句中,或者更好地尝试使用资源结构。当您选择难度2或3时,是否有单词?或者在这种情况下,
workingHangman.getWords().size()
是否返回
0
,在这种情况下,将选择索引0,它是空列表的无效索引?
case 3:retHangman=mediumHangman;中断应该是
情况3:retHangman=hardHangman;中断首先检查尺寸,然后尝试获取值。我回家后会检查并返回给您。谢谢
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);
}  
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);
    }
}