0

我正在尝试创建一个可以执行简单操作的计算器,并且您应该能够拥有多个值和不同的运算符。它还没有完成,所以稍后会改进,但现在我对执行计算的方法有疑问。

在我发布相关代码之前。另一部分只是 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;
}

我得到的错误是:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
at com.calculatorSwing.business.Calculator.performCalculation(Calculator.java:146)
at com.calculatorSwing.business.Calculator.access$6(Calculator.java:143)

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

4

2 回答 2

2

改变你for的方法循环performCalculation

从:

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

至:

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

根据您的loop以下ArrayList获取将是异常。

Numbers.get(Numbers.size());// will generate IndexOutOfBoundsException.
于 2013-10-04T09:02:15.183 回答
0

问题可能是您传递 List 时只有一个元素

然后Numbers.size()将返回1,条件 index <= Numbers.size()将被评估为true按原样index初始化1

结果你会得到Numbers.get(1)。这将引发IndexOutOfBoundsException空或具有一个元素的数组。

解决办法是不使用<=,只<在for条件下使用。

编辑:

计算方法performCalculation是在没有控制的情况下对许多操作进行复杂的执行。

您应该首先验证输入。

  • 检查该列表是否具有适当的大小并对此做出反应。

Case1:当号码列表为空时,会发生什么?案例2:当操作员列表为空时会发生什么?Case3:当数字只有一个值并且运算符为空时?等等

这是第一阶段。当您确定要执行什么时,您可以按预期执行。

您必须设置一组必须完成的规则​​,您的算法才能正常工作。该规则的任何例外都必须包含在附加代码中。只有有效的输入才能在那里工作,您必须确保提供它。

尝试编写更多的方法来分离逻辑,然后你会发现你现在错过的差距。

于 2013-10-04T09:01:59.297 回答