【问题标题】:Java ArrayList AWT-EventQueue-0 error IndexOutOfBounds, CalculationJava ArrayList AWT-EventQueue-0 错误 IndexOutOfBounds,计算
【发布时间】:2016-12-05 10:19:03
【问题描述】:

我遇到了一个问题,当我尝试计算一个科学表达式时,它会编译,但是当我运行它时它会崩溃。我的程序的工作方式是它接收一个包含需要评估的数学表达式的字符串。首先,它被拆分为一个 ArrayList,分别包含数字和运算符。然后搜索允许程序首先使用括号内的表达式的任何括号。然后它调用计算来计算答案。然而,我一直收到的错误是“线程中的异常”AWT-EventQueue-0”java.lang.IndexOutOfBoundsExcepton: Index:0, Size:0”我认为它与我的数组列表的大小有关但是,我无法发现错误,请其他人帮我弄清楚吗?我认为问题很可能与 splitLabel 和 calculate 方法有关

public ArrayList<String> splitLabel(String val){
    ArrayList<String> label_split = new ArrayList<String>();
    String value = "";
    String op = "";

    for (int i = 0; i< val.length(); i++){
        boolean isDigit = Character.toString(val.charAt(i)).matches("[0123456789.]+");
        boolean isOperator = Character.toString(val.charAt(i)).matches("[+*/^-]+");
        boolean isSin = (Character.toString(val.charAt(i)).equals("s") && Character.toString(val.charAt(i+1)).equals("i") && Character.toString(val.charAt(i+2)).equals("n"));
        boolean isCos = (Character.toString(val.charAt(i)).equals("c") && Character.toString(val.charAt(i+1)).equals("o") && Character.toString(val.charAt(i+2)).equals("s"));
        boolean isTan = (Character.toString(val.charAt(i)).equals("t") && Character.toString(val.charAt(i+1)).equals("a") && Character.toString(val.charAt(i+2)).equals("n"));
        boolean isOpBracket = Character.toString(val.charAt(i)).equals("(");
        boolean isClBracket = Character.toString(val.charAt(i)).equals(")");  

            if (isOperator && !value.equals("")){
                op = Character.toString(val.charAt(i));
                label_split.add(value);
                label_split.add(op);
                op = "";
                value = "";
            } else if (isOperator && value.equals("")){
                if (Character.toString(val.charAt(i)).equals("-")){
                    value = Character.toString(val.charAt(i));
                }
            } else if (isSin){
                label_split.add("sin");
            }else if (isCos){
                label_split.add("cos");
            }else if (isTan){
                label_split.add("tan");
            } else if (isOpBracket && !value.equals("")){
                label_split.add(value);
                label_split.add("(");
                value = "";
            } else if (isOpBracket && value.equals("")){
                label_split.add("(");
            } else if (isClBracket && !value.equals("")){
                label_split.add(value);
                label_split.add(")");
                value = "";
            }
        if (i== val.length()-1 && !value.equals("")){
            label_split.add(value);
        } else if (i== val.length()-1 && Character.toString(val.charAt(i)).equals(")")){
            label_split.add(")");
        }
    } return label_split;
}   
public String bracket(ArrayList<String> label_split){
    ArrayList<Integer> opBra = new ArrayList<Integer>();
    ArrayList<Integer> clBra = new ArrayList<Integer>();
    ArrayList<String> calculation = new ArrayList<String>();
    int counter = 0;
    int counter1 = 0;

    if (label_split.contains("(") && label_split.contains(")")){
        for (int j=0; j<label_split.size(); j++){
            if (label_split.get(j).equals("(")){
                counter = counter + 1;
                opBra.add(j);
            } else if (label_split.get(j).equals(")")){
                counter1 = counter1 + 1;
                clBra.add(j);
            }
        } 
        if (counter1 != counter){
            return "error missing bracket";
        } else {
            for (int j=opBra.size(); j>0; j--){
                int opBraPos = opBra.get(j) + 1; //+1 and -1 so it doesn't include ()
                int clBraPos = clBra.get(opBra.size()-j) - 1;
                opBra.remove(j);
                clBra.remove(opBra.size()-j);

                for(int t = 0; t < (clBraPos - opBraPos); t++){
                    calculation.add(label_split.get(t+opBraPos));
                }

                String value = calculate(calculation);
                label_split.set(j , value);
                calculation.clear();

                for (int n = 0; n < ((clBraPos+1) - opBraPos); n++){
                    label_split.remove(n);
                }
            }
        }
        return calculate(label_split);
    } else{
        return calculate(label_split);
    } 
}
public String calculate(ArrayList<String> calculation){
    double value = 0.0;
    String value1 = "";
    boolean isOperator = calculation.contains("[+*/^-]+");  
    boolean isSin =  calculation.contains("sin"); //...ETC


    for (int i=0; i < calculation.size(); i++){
        if (calculation.get(i).equals("^") && i < calculation.size() && i < 0){
            boolean isDigit1 = calculation.get(i-1).matches("[0123456789.-]+");
            boolean isDigit2 = calculation.get(i+1).matches("[0123456789.-]+");
            if (isDigit1 && isDigit2){
                value = Math.pow(Double.parseDouble(calculation.get(i-1)), Double.parseDouble(calculation.get(i+1)));
                value1 = Double.toString(value);
                calculation.set(i,value1);
                calculation.remove(i-1);
                calculation.remove(i+1);
            }
        }
    }

    for (int a=0; a < calculation.size(); a++){
        if ( (calculation.get(a)).equals("sin") && a < calculation.size() && a < 0){
            boolean isDigit1 = calculation.get(a+1).matches("[0123456789.-]+");
            if (isDigit1){
                value = Math.sin(Double.parseDouble(calculation.get(a+1)));
                value1 = Double.toString(value);
                calculation.set(a,value1);
                calculation.remove(a+1);
            }
        }
    }

    for (int b=0; b < calculation.size(); b++){
        if ( (calculation.get(b)).equals("cos") && b < calculation.size() && b < 0){
            boolean isDigit1 = calculation.get(b+1).matches("[0123456789.-]+");
            if (isDigit1){
                value = Math.cos(Double.parseDouble(calculation.get(b+1)));
                value1 = Double.toString(value);
                calculation.set(b,value1);
                calculation.remove(b+1);
            }
        }
    } // ETC

    return calculation.get(0);
}

【问题讨论】:

  • 也许说它在哪一行失败了?
  • 它说:“在CalculatorFrameA.calculate(java:578)”这是最后的“}”“在CalculatorFrameA.bracket(java:449)”这是“返回计算(label_split);”
  • 说实话,您的代码相当复杂。很明显,calculation 返回时的大小为 0,因此要么是这样传递的,要么是所有元素都被删除。我会说你在迭代它时从中删除元素并且不要调整i,这样以后就会给你带来问题。您可以查看stackoverflow.com/questions/114586/…,了解一些更好的方法来实现解析器。
  • @Iluvatar 是的,我的代码正在删除它完成的每个计算,直到你得到一个最终答案,然后返回......我在截止日期前只剩下大约 2 小时,所以我真的没有有时间创建一个新方法......你认为我的代码仍然可以通过一些调整来保存吗?

标签: java arraylist calculation


【解决方案1】:

这不是你的问题,但它肯定是错误的:

calculation.set(i,value1);
calculation.remove(i-1);
calculation.remove(i+1);

问题是remove(i-1) 将导致从i 开始的所有内容的索引减一。然后remove(i+1) 将删除之前在索引i+2 处的元素。

然后是这样的:

for (int i=0; i < calculation.size(); i++){
    if (calculation.get(i).equals("^") && 
        i < calculation.size() && 
        i < 0) {

考虑一下。如果i 从零开始并递增到非负的size(),那么i 怎么可能小于零。如果i 永远不会小于零,那么if 测试怎么可能成功。 (你在其他地方重复这种模式。)

然而,真正的问题是不知何故你在一个空列表上调用calculate

我认为是时候学习使用调试器了.....

【讨论】:

    猜你喜欢
    • 2013-03-07
    • 2015-03-13
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多