是什么导致此代码引发异常?

时间:2019-11-28 04:23:10

标签: java debugging

在按照BODMAS规则解决复杂的数学表达式的Java中创建计算器的尝试失败后,我认为创建一个参数为字符串的方法很重要。这种方法应检测括号和数学符号(即打开关闭 括号),并且应将上述任意两个符号之间的任何字符串(例如 temp )转换为重复声明< strong> temp2 ,除非 temp 为空(即“”)。然后,该方法将 temp2 值和符号以与参数中相同的顺序存储在Objects列表中。该方法考虑到,如果第一个字符为数字,则要放置在列表中的第一个对象应该是参数的子串的双精度值,该值从零到第一个的索引标志。如果最后一个字符是列表最后一个索引中的数字,则等效操作完成。 上面的想法使我创建了以下项目:

suggest_next_locations

即使我导入了上面的类并调用方法getNumber,上面的代码也看起来令人满意,如下所示:

package maths.calculator;

import java.util.ArrayList;

public class NumGetter {
    static String expression;
    static ArrayList<Integer> preList = new ArrayList<>();
    static ArrayList<Object> list = new ArrayList<>();

    public static ArrayList<Object> getNumber(String num) {
        expression = num;
        try {
            if (expression == null) {
                expression = "";
            }
            if (expression == "") {
                return list;
            }

            int condition = 0;
            for (char chars : expression.toCharArray()) {
                if (chars == '-' || chars == '+' || chars == '÷' || chars == '×' || chars == ')' || chars == '(') {
                    preList.add(condition);
                }
                condition++;
            }

            if (preList.size() != 0) {
                System.out.println(preList);
                if (expression.charAt(0) >= '0' && expression.charAt(0) <= '9') {
                    String local = expression.substring(0, preList.get(0));
                    list.add(Double.parseDouble(local));
                }

                for (int i = 0; i < (preList.size() - 1); i++) {
                    int min = preList.get(i);
                    int next = preList.get(i + 1);
                    String local = expression.substring(min + 1, next);
                    if (local.length() == 0) {
                        list.add(expression.charAt(min));
                    } else {
                        double temp = Double.parseDouble(local);
                        list.add(expression.charAt(min));
                        list.add(temp);
                    }
                }
                if (expression.charAt(num.length() - 1) >= '0' && expression.charAt(num.length() - 1) <= '9') {
                    condition = preList.get(preList.size() - 1);
                    String local = expression.substring(condition);
                    list.add(expression.charAt(condition));
                    list.add(Double.parseDouble(local));
                }

            } else {
                list.add(Double.parseDouble(expression));
            }
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        return list;
    }

}

问题出在输出中。在每种情况下都会引发异常。通常,上面的结果是:

import java.util.ArrayList;

import maths.calculator.NumGetter;

public class Text {
    public static void main(String[] args) {

        System.out.println("(12+8)0");
        String one = "(12+8)0";
        ArrayList<Object> two = NumGetter.getNumber(one);
        System.out.println(two.toString());

    }
}

但是,当我将迭代Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 3 out of bounds for length 3 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:373) at java.base/java.util.ArrayList.get(ArrayList.java:425) at maths.calculator.NumGetter.getNumber(NumGetter.java:43) at demo.Text.main(Text.java:12) (12+8)0 [0, 3, 5] 更改为for (int i = 0; i < (preList.size() - 1); i++)时,顺便说一句,这应该是不正确的,结果非常接近预期的答案:

for (int i = 0; i < (preList.size() - 2); i++)

可能出了什么问题... 我非常需要你的大脑。

2 个答案:

答案 0 :(得分:0)

以下是在jQuery(document).ready(function(){ $( '.check' ).on('click', function(){ if( $(this).is(":checked") ) { $('.container .other-class').removeClass('item-2').addClass('your-class-name'); } else { $('.container .other-class').removeClass('your-class-name').addClass('item-2'); } }); }); 循环的第二次迭代中抛出异常java.lang.StringIndexOutOfBoundsException: String index out of range: -1的行:

for

第一次第一次迭代:String local = number.substring(++min, next); //line throwing exception

第二次迭代:number.substring(1, 1);

在第二次迭代中,它引发异常,因为不允许number.substring(2, 1);方法的beginIndex大于lastIndex。有关更多信息,请查看here

谢谢

答案 1 :(得分:0)

终于。我不敢相信最后一个错误是在最后一个if块中:

String local = expression.substring(condition);

我认为应该是:

String local = expression.substring(condition+1);

感谢所有人,尤其是@Andreas