【问题标题】:Arraylist exception errorArraylist异常错误
【发布时间】:2014-03-27 06:05:13
【问题描述】:

我是java编程的初学者。我正在尝试开发一个程序,但是当我运行下面发布的程序时,它返回了这个错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:635)
at java.util.ArrayList.get(ArrayList.java:411)
at Instruction.instructionProcess(Instruction.java:27)
at Instruction.main(Instruction.java:79)
Java Result: 1

这是我的代码:

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

public class Instruction {

    public static void firstWord(ArrayList<String> optionCode, ArrayList<String> optionCodeList) {
        for (int i = 0; i<optionCode.size(); i++) {
            if (!optionCodeList.contains(optionCode.get(i))) {
                optionCode.set(i,optionCode.get(i).substring(0, optionCode.get(i).indexOf(' ')) + "  *****ERROR*****");
            }
        }
    }

    public static void instructionProcess(ArrayList<String> optionCode) {
        for (int i=0; i<optionCode.size(); i++) {
            if (optionCode.get(i).contains("LD")) {
                if (optionCode.get(i+1).contains("ADD.D")) {
                    optionCode.add(i+1, "stall   -----------");
                }
            }
        }
        for (int i=0; i<optionCode.size(); i++) {
            if (optionCode.get(i).contains("ADD.D")) {
                if (optionCode.get(i+1).contains("S.D")) {
                    optionCode.add(i+1, "stall   ----------");
                    optionCode.add(i+2, "stall   ----------");
                }
            }
        }
        for (int i=0; i<optionCode.size(); i++) {
            if (optionCode.get(i).contains("BNEZ")) {
                optionCode.add(i+1, "stall   ----------");
            }
            System.out.println(optionCode.get(i));
        }
    }

    public static void printOutput(ArrayList<String> optionCode) {
        for (int i=0; i<optionCode.size(); i++) {
            System.out.println(optionCode.get(i).substring(0, optionCode.get(i).indexOf(' ')));
        }
    }

    public static void main(String[] args) throws IOException {
        ArrayList<String> optionCodeList = new ArrayList<String>();
        optionCodeList.add("LD");
        optionCodeList.add("SD");
        optionCodeList.add("ADD.D");
        optionCodeList.add("SUB.D");
        optionCodeList.add("MUL.D");
        optionCodeList.add("DIV.D");
        optionCodeList.add("SUBI");
        optionCodeList.add("SUB");
        optionCodeList.add("ADDI");
        optionCodeList.add("ADD");
        optionCodeList.add("BNEZ");
        optionCodeList.add("BEZ");
        optionCodeList.add("BRA");

        Scanner File = new Scanner(new File("in_sample.txt"));
        while (File.hasNextLine()) {
            String line = File.nextLine();
            ArrayList<String> optionCode = new ArrayList<>();
            Scanner text = new Scanner(line);
            while (text.hasNextLine()) {
                optionCode.add(text.nextLine());
            }
            firstWord(optionCode, optionCodeList);
            instructionProcess(optionCode);
            printOutput(optionCode);

            PrintWriter outFile = new PrintWriter("Output.txt");
            for (int i = 0; i < optionCode.size(); i++) {
                outFile.println(optionCode.get(i));
            }
            outFile.close();
        }
    }

}

【问题讨论】:

  • 看看嵌套的if。如果您点击结束元素并且它满足contains 条件,您将尝试访问超出范围的i+1 元素。
  • java.lang.IndexOutOfBoundsException: Index: 1, Size: 1:异常很明显。您正在尝试访问大小为1ArrayList 的位置1,因此唯一可用的索引是0
  • 你甚至还有行号,所以你可以准确地看到是哪一行代码导致了这个异常。
  • 另外,您有三个以完全相同的方式迭代的个体。由于它们似乎都不依赖于之前修改数组的迭代,因此这些迭代确实是多余的。

标签: java arraylist


【解决方案1】:

一般看那几行

 for (int i=0; i<optionCode.size(); i++) {
            if (optionCode.get(i).contains("LD")) {
                if (optionCode.get(i+1).contains("ADD.D")) { // from there you got an exception
                    optionCode.add(i+1, "stall   -----------");

如果您想从列表中的下一个不是您当前迭代的元素的元素中获取某物,您必须简单地将较弱的条件放在loop 中:

 for (int i=0; i<optionCode.size()-1; i++) {
            if (optionCode.get(i).contains("LD")) {
                if (optionCode.get(i+1).contains("ADD.D")) { //now you have sure that i+1 will return sth not null.
                    optionCode.add(i+1, "stall   -----------");
//now you have sure that i+1 will return sth not null.

请在您尝试获取i+1 的每个循环中替换您的loop 条件,因为它会导致异常。

【讨论】:

    【解决方案2】:

    for (int i=0; i<optionCode.size(); i++) {
                if (optionCode.get(i).contains("ADD.D")) {
                    if (optionCode.get(i+1).contains("S.D")) {
                        optionCode.add(i+1, "stall   ----------");
                        optionCode.add(i+2, "stall   ----------");
                    }
                }
            }
    

    在这里,当 i 达到最大值时 optionCode.get(i+1) 将不起作用.. 你必须在那种情况下应用例外..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-25
      • 2013-04-30
      • 2016-01-17
      • 2018-08-12
      • 2023-03-24
      • 1970-01-01
      • 2014-02-16
      • 2014-08-05
      相关资源
      最近更新 更多