java - 对为什么我得到 Index out of bounds 错误感到困惑?
问题描述
因此,我正在尝试创建一个程序,该程序采用文本文件,为文件中的所有单词创建索引(按行号)并将索引写入输出文件。这是主要课程:
import java.util.Scanner;
import java.io.*;
public class IndexMaker
{
public static void main(String[] args) throws IOException
{
Scanner keyboard = new Scanner(System.in);
String fileName;
// Open input file:
if (args.length > 0)
fileName = args[0];
else
{
System.out.print("\nEnter input file name: ");
fileName = keyboard.nextLine().trim();
}
BufferedReader inputFile =
new BufferedReader(new FileReader(fileName), 1024);
// Create output file:
if (args.length > 1)
fileName = args[1];
else
{
System.out.print("\nEnter output file name: ");
fileName = keyboard.nextLine().trim();
}
PrintWriter outputFile =
new PrintWriter(new FileWriter(fileName));
// Create index:
DocumentIndex index = new DocumentIndex();
String line;
int lineNum = 0;
while ((line = inputFile.readLine()) != null)
{
lineNum++;
index.addAllWords(line, lineNum);
}
// Save index:
for (IndexEntry entry : index)
outputFile.println(entry);
// Finish:
inputFile.close();
outputFile.close();
keyboard.close();
System.out.println("Done.");
}
}
该程序包含另外两个类:IndexEntry
代表一个索引条目,以及DocumentIndex
代表文档的整个索引的类:所有索引条目的列表。索引条目应始终按字母顺序排列。所以这两个类的实现如下所示
import java.util.ArrayList;
public class IndexEntry {
private String word;
private ArrayList<Integer> numsList;
public IndexEntry(String w) {
word = w.toUpperCase();
numsList = new ArrayList<Integer>();
}
public void add(int num) {
if (!numsList.contains(num)) {
numsList.add(num);
}
}
public String getWord() {
return word;
}
public String toString() {
String result = word + " ";
for (int i=0; i<numsList.size(); i++) {
if (i == 0) {
result += numsList.get(i);
} else {
result += ", " + numsList.get(i);
}
}
return result;
}
}
import java.util.ArrayList;
public class DocumentIndex extends ArrayList<IndexEntry> {
public DocumentIndex() {
super();
}
public DocumentIndex(int c) {
super(c);
}
public void addWord(String word, int num) {
super.get(foundOrInserted(word)).add(num);
}
private int foundOrInserted(String word) {
int result = 0;
for (int i=0; i<super.size(); i++) {
String w = super.get(i).getWord();
if (word.equalsIgnoreCase(w)) {
result = i;
} else if (w.compareTo(word) > 0) {
super.add(i, new IndexEntry(w));
result = i;
}
}
return result;
}
public void addAllWords(String str, int num) {
String[] arr = str.split("[^A-Za-z]+");
for (int i=0; i<arr.length; i++) {
if (arr[i].length() > 0 ) {
addWord(arr[i], num);
}
}
}
}
当我运行这个程序时,我遇到了一个错误,我不确定错误来自哪里。
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
at java.base/java.util.Objects.checkIndex(Objects.java:372)
at java.base/java.util.ArrayList.get(ArrayList.java:459)
at DocumentIndex.addWord(DocumentIndex.java:14)
at DocumentIndex.addAllWords(DocumentIndex.java:35)
at Main.main(Main.java:53)```
解决方案
问题出现在哪里:
String line;
int lineNum = 0;
while ((line = inputFile.readLine()) != null)
{
lineNum++;
index.addAllWords(line, lineNum);
}
lineNum
在执行之后的行之前加1。在最后一个循环中,lineNum
将比最大值多 1,因为循环从 line 开始1
,并且基于 0 索引。
相反,使用:
String line;
int lineNum = 0;
while ((line = inputFile.readLine()) != null)
{
index.addAllWords(line, lineNum);
lineNum++;
}
推荐阅读
- f# - 使用 FsCheck 从 Xunit 测试中删除 Arb.registerByType 的使用
- python - stdin.read() 不读取任何输入
- angular - 如何测试 Material Datepicker 的 i18n?
- python - Python Pandas 混合类型警告 - “dtype”保留数据?
- python - 使用 `django-push-notifcations` 包;`push_notifications_gcmdevice` 表上的`active` 状态如何变化。收到发送的消息计数
- php - Wordpress - 在functions.php中获取http响应代码
- android - 构建android应用程序时react-native找不到gradle wrapper
- python - 从列表中查找包含变量的文件夹中的文件名,打开 JSON 文件并对它们执行操作
- python - Python List 正在打印重复项并且无法索引值
- powershell - Powershell到期日期计算错误的天数