我正在尝试创建一个可以执行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;
}
我得到的错误是:
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内部有一个“+”。问题是什么?
答案 0 :(得分:2)
更改for
方法的performCalculation
循环。
发件人:强>
for(int index = 1; index <= Numbers.size(); index++)
要强>
for(int index = 1; index < Numbers.size(); index++)
根据您loop
的{{1}}跟随ArrayList
获取将是例外。
Numbers.get(Numbers.size());// will generate IndexOutOfBoundsException.
答案 1 :(得分:0)
问题可能是您只传递了一个元素
然后Numbers.size()
将返回1
,条件index <= Numbers.size()
将评估为true
,index
初始化为1
。
结果你得到Numbers.get(1)
。这将为一个元素的空或数组引发IndexOutOfBoundsException
。
解决方案是不使用<=
,而只使用<
作为条件。
编辑:
计算方法performCalculation
是复杂的,可以执行多个操作而无需控制。
您应首先验证输入。
案例1:当数字列表为空时,会发生什么? 案例2:当运营商列表为空时会发生什么? 情况3:当数字有一个值且操作符为空时? 等。
这是第一阶段。当您确定要执行的操作时,您可以按预期执行。
您必须设置一系列必须填写的规则才能使算法正常运行。该规则的任何例外都必须由其他代码涵盖。只有有效的输入才能在那里工作,您必须确保提供它。
尝试编写更多方法来分离逻辑,然后你会发现你现在想念的差距。