gpt4 book ai didi

java - ArrayList 的 IndexOutOfBounds(用多个数字测试)

转载 作者:行者123 更新时间:2023-11-29 05:38:58 25 4
gpt4 key购买 nike

所以每当我尝试在这个特定的文本中使用这个 ArrayList 时,我都会遇到这个错误。所以这是问题代码:

public static String lines(int start, int end, InputStream is) {
try {
BufferedReader fileBR = new BufferedReader(new InputStreamReader(is));
List<String> lines = new ArrayList<String>();
String strLine;
StringBuilder tempSB = new StringBuilder();

while ((strLine = fileBR.readLine()) != null) {
lines.add(strLine);
}

for (int i = start - 1; i < end; i++) {
tempSB.append(lines.get(i));
tempSB.append("\n");
}
line = tempSB.toString();
} catch (IOException e) {
e.printStackTrace();
}
return line;
}

我不确定该代码的效率如何,但在我的程序中获得一些基本功能后,我会仔细研究并提高效率。问题是当我使用它时:

    // Edit lines according to where the headerFile starts
public static String getHeaderArt() {
return lines(1, 21, headerFile);
}

// Change to get the introduction text from a file
public static String getIntroText() {
return lines(2, 17, storyFile);
}

public static String getStart() {
return lines(20, 27, storyFile);
}

出于某种原因,前两个代码有效,但第三个无效。我的故事情节文件有 28 行,所以我不确定为什么它不起作用。

堆栈跟踪:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 19, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at com.hathorsrpg.DefaultText.lines(DefaultText.java:42)
at com.hathorsrpg.DefaultText.getStart(DefaultText.java:86)
at com.hathorsrpg.Main.intro(Main.java:23)
at com.hathorsrpg.Main.main(Main.java:87)

这是一个没有文本文件的 SSCCE:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class SSCCE {
public static InputStream storyFile = SSCCE.class.getResourceAsStream("/resources/storytext.txt");
public static InputStream headerFile = SSCCE.class.getResourceAsStream("/resources/castle.txt");

public static String line;

public static String lines(int start, int end, InputStream is) {
try {
BufferedReader fileBR = new BufferedReader(new InputStreamReader(is));
List<String> lines = new ArrayList<String>();
String strLine;
StringBuilder tempSB = new StringBuilder();

while ((strLine = fileBR.readLine()) != null) {
lines.add(strLine);
}

for (int i = start - 1; i < end; i++) {
tempSB.append(lines.get(i));
tempSB.append("\n");
}
line = tempSB.toString();
} catch (IOException e) {
e.printStackTrace();
}
return line;
}

// Edit lines according to where the headerFile starts
public static String getHeaderArt() {
return lines(1, 21, headerFile);
}

// Change to get the introduction text from a file
public static String getIntroText() {
return lines(2, 17, storyFile);
}

public static String getStart() {
return lines(20, 27, storyFile);
}
}

感谢 future 的帮助,我似乎无法弄清楚问题所在。如果您想将某些内容放入文本文件中,请执行以下操作:

最佳答案

问题是你试图重用

public static InputStream storyFile

在两个电话中getIntroText()getStart() .虽然,startend传递的参数不同,请注意您是如何从 BufferedReader 读取的

while ((strLine = fileBR.readLine()) != null) { // read completely
lines.add(strLine);
}

这意味着 InputStream已经用完,无法在getStart()中重复使用因为这次fileBR.readLine()会返回 NULL

while ((strLine = fileBR.readLine()) != null) {
lines.add(strLine); // never gets executed
}

因此,List<String> linesgetStart() size() = 0 为空但是您的代码仍然继续并调用

for (int i = start - 1; i < end; i++) {
tempSB.append(lines.get(i)); // index = 20 - 1 = 19
tempSB.append("\n");
}

因此你得到

java.lang.IndexOutOfBoundsException: Index: 19, Size: 0

关于java - ArrayList 的 IndexOutOfBounds(用多个数字测试),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18404045/

25 4 0