Java-获取IndexOutOfBoundsException

时间:2015-05-04 00:46:17

标签: java indexoutofboundsexception

我遇到问题,我在下面的代码第22行收到IndexOutOfBoundsException。该程序的目的是充当具有以下优先顺序的表达式评估程序:

 Operator| Description | Level | Associativity 
 --------+-------------+-------+---------------
    &    | Bitwise AND |   1   | left to right
    ^    | Bitwise XOR |   2   | left to right
    |    | Bitwise OR  |   3   | left to right

如果程序被赋予输入表达式,如" 1 | 8& 3"使用scanner类,程序应解析此输入并将结果输出为1。

示例输出:

Enter the expression: 1 | 8 & 3
Result of the given expression: 1

说明:

评估的方式是:

8& 3 = 1000& 0011 = 0000 = 0

1 | 0 = 0001 | 0000 = 1

我一直在努力让程序正常运行。以下是我的最新代码:

import java.util.ArrayList;
import java.util.Scanner;

public class Problem1 {
   public static void main(String[] args) throws Exception {

    try {
        ArrayList<String> inputarray = new ArrayList<String>();
        @SuppressWarnings("resource")
        Scanner input = new Scanner(System.in);

        System.out.print("Enter an expression with single digit integers (example: \"1 | 8 & 3\"): ");

        if(input.hasNextLine()) {
            inputarray.add(input.nextLine());
        }

        int j = 1;

        j = 1;
        for(int i = 0; i < inputarray.size(); i++) {
            if(inputarray.get(j) == "&") {
                inputarray.add((j+1), Integer.toString(Integer.parseInt(inputarray.get(j-1)) & Integer.parseInt(inputarray.get(j+1))));
                System.out.println(" Result of the given expression: " + inputarray);
                inputarray.remove((j-1));
                inputarray.remove((j));
            }
            if(j <= (inputarray.size() - 3)) {
                j += 2;
            }
            else if(j == (inputarray.size() - 2)) {
                break;
            }
        }

        j = 1;
        for(int i = 0; i < inputarray.size(); i++) {
            if(inputarray.get(j) == "^") {
                inputarray.remove(j);
                inputarray.add(j, Integer.toString(Integer.parseInt(inputarray.get(j-1)) ^ Integer.parseInt(inputarray.get(j+1))));
                inputarray.remove((j-1));
                inputarray.remove((j+1));
            }
            if(j <= (inputarray.size() - 3)) {
                j += 2;
            }
            else if(j == (inputarray.size() - 2)) {
                break;
            }
        }

        j = 1;
        for(int i = 0; i < inputarray.size(); i++) {
            if(inputarray.get(j) == "|") {
                inputarray.remove(j);
                inputarray.add(j, Integer.toString(Integer.parseInt(inputarray.get(j-1)) | Integer.parseInt(inputarray.get(j+1))));
                inputarray.remove((j-1));
                inputarray.remove((j+1));
            }
            if(j <= (inputarray.size() - 3)) {
                j += 2;
            }
            else if(j == (inputarray.size() - 2)) {
                break;
            }
        }

    }
    catch(Exception e) {
        e.printStackTrace();
        System.err.println("Invalid input entered, please try again");
    }
    finally {
        System.out.println();
        main(null);
    }
}
}

1 个答案:

答案 0 :(得分:1)

有几个问题。

  • 您似乎正在将一个String读入ArrayList。这意味着ArrayList的大小为1.因此inputarray.get(1)将产生您观察到的异常。您可能打算逐个字符地解析字符串,但这不是这里发生的事情。
  • 使用.equals()而不是==来比较字符串。这已在Stackoverflow上多次讨论过了。
  • 在迭代集合时向集合中添加和删除项目是危险的,需要特别小心。也许你需要重新思考逻辑。