首页 > 解决方案 > 对为什么我得到 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)```

标签: java

解决方案


问题出现在哪里:

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

推荐阅读