Java 计算器算法

Java 计算器算法,java,indexoutofboundsexception,Java,Indexoutofboundsexception,我正在尝试创建一个计算器,它可以模拟simpel运算,你应该能够有几个值和不同的运算符。它还没有完成,所以稍后会改进,但现在我对执行计算的方法有问题 在我发布相关代码之前。另一部分是Swing对象实例化 private class OperatorListener implements ActionListener{ public void actionPerformed(ActionEvent e){ if(e.getSource()== resetButto

我正在尝试创建一个计算器,它可以模拟simpel运算,你应该能够有几个值和不同的运算符。它还没有完成,所以稍后会改进,但现在我对执行计算的方法有问题

在我发布相关代码之前。另一部分是Swing对象实例化

    private class OperatorListener implements ActionListener{

    public void actionPerformed(ActionEvent e){
        if(e.getSource()== resetButton){
            Operators.clear();
            Numbers.clear();
            actualNumber.setText("");
            previousNumbers.setText("");
        } else if(e.getSource() == sumButton){
            Numbers.add(new Double(actualNumber.getText()));
            Double Result = performCalculation(Numbers, Operators);
            actualNumber.setText(String.valueOf(Result));
            previousNumbers.setText("");
        } else if(e.getSource() == sqrtButton){

        } else {
            /*
             * The operator numbers handlers. When a operator
             * button is clicked the number in the lower JTF
             * is parsed to Double value and added to Numbers
             * list. Operator added to Operators list. Lower
             * JTF is cleared.*/
            Numbers.add(new Double(actualNumber.getText()));
            Operators.add(e.getActionCommand());
            String currentPriovusNumbers = previousNumbers.getText();
            previousNumbers.setText(currentPriovusNumbers + " " + actualNumber.getText() + " " + e.getActionCommand());
            actualNumber.setText("");
        }
    }
}

    private double performCalculation(ArrayList<Double> Numbers, ArrayList<String> Operators){
    double result = Numbers.get(0);
    for(int index = 0; index < Numbers.size(); index++){
        switch(Operators.get(index)){
            case "+":
                result += Numbers.get(index + 1);
                break;
            case "-":
                result -= Numbers.get(index + 1);
                break;
            case "/":
                result /= Numbers.get(index + 1);
                break;
            case "*":
                result *= Numbers.get(index + 1);
                break;
            case "%":
                result %= Numbers.get(index + 1);
                break;
        }
    }
    return result;
}

第146行是第一个switch case语句,它让我知道没有我试图访问的索引,但我检查了操作符列表,元素0中有一个“+”。问题是什么?

问题可能是您传递的列表只有一个元素


然后
Numbers.size()
将返回
1
,条件
索引为
执行计算方法的
循环更改

发件人:

 for(int index = 1; index <= Numbers.size(); index++)
for(int index = 1; index < Numbers.size(); index++)

问题是,我将double变量初始化为数字中的第一个元素,我想对该变量执行操作,因此使用第一个元素后,我必须向索引中添加+1,例如,将下一个double添加到result。我改变了性能计算方法。问题是你的计算逻辑太复杂了。您应该尝试用原子方法将其分开。谢谢,我设法解决了它,添加了数字。size()-1作为循环条件。您是否忘记了Java索引从0开始,而不是从1开始?@StuWhyte您可能没有注意到
double result=Numbers.get(0)之前用于循环。@Masud啊,我没有。我错了!
for(int index = 1; index < Numbers.size(); index++)
Numbers.get(Numbers.size());// will generate IndexOutOfBoundsException.