0

科学式を計算しようとすると、コンパイルはできますが、実行するとクラッシュするという問題があります。私のプログラムの動作方法は、評価する必要がある数式を含む文字列を受け取ることです。まず、数値と演算子を別々に含む ArrayList に分割されます。次に、プログラムが最初に括弧内の式を処理できるようにする括弧が検索されます。次に、答えを計算する calculate を呼び出します。しかし、私が受け取り続けているエラーは「 Exception in thread "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);
}
4

1 に答える 1

0

これはあなたの問題ではありませんが、確かに間違っているようです:

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

問題は、それ以降remove(i-1)のすべてのインデックスがi1 減らされることです。次にremove(i+1)、以前 index にあった要素を削除しますi+2

次に、これがあります:

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

考えてみてください。ゼロiから始まり、size()非負になるまでインクリメントされる場合、どのようにしiてゼロ未満になることができますか。また、iが 0 未満になることがない場合、ifテストはどのように成功するのでしょうか。(他の場所でもこのパターンを繰り返します。)

ただし、本当の問題は、どういうわけcalculateか空のリストで呼び出していることです。

デバッガの使い方を学ぶ時が来たと思います.....

于 2016-12-05T11:05:13.667 に答える