JavaFX计算器RPN-方法调用后的运行时异常
我正在尝试使用JavaFX和反向波兰符号创建一个计算器。其思想是使用TextField从用户处读取输入,然后将公共中缀形式转换为后缀形式,进行计算,然后按“等于”按钮显示输出。我希望它能做双打手术。来自用户的公式示例如下: ((234*(7-3))/2) 转换为后缀形式后,它应该如下所示:234 7 3-*2/JavaFX计算器RPN-方法调用后的运行时异常,java,javafx,postfix-notation,Java,Javafx,Postfix Notation,我正在尝试使用JavaFX和反向波兰符号创建一个计算器。其思想是使用TextField从用户处读取输入,然后将公共中缀形式转换为后缀形式,进行计算,然后按“等于”按钮显示输出。我希望它能做双打手术。来自用户的公式示例如下: ((234*(7-3))/2) 转换为后缀形式后,它应该如下所示:234 7 3-*2/ 在经历了一些麻烦之后,我成功地做到了这一点,但只是作为一个使用控制台的测试。 当我将其与以前构建的JavaFXGUI连接时,它会引发运行时异常,我不知道为什么会发生这种情况。因此,我将字
在经历了一些麻烦之后,我成功地做到了这一点,但只是作为一个使用控制台的测试。 当我将其与以前构建的JavaFXGUI连接时,它会引发运行时异常,我不知道为什么会发生这种情况。因此,我将字符串标记存储在ArrayList中,下面是我的解析方法:
public void parseExpression(String expr) {
char[] temp = expr.toCharArray();
StringBuffer stringBuffer = new StringBuffer();
List<String> list = new ArrayList<String>();
for (int i=0;i<temp.length;i++) {
if(temp[i]=='(' || temp[i]==')' || temp[i]=='+' || temp[i]=='-' || temp[i]=='*' || temp[i]=='/') {
list.add(Character.toString(temp[i]));
} else{
stringBuffer.append(temp[i]);
if ((i+1)<temp.length){
if (temp[i+1]=='(' || temp[i+1]==')' || temp[i+1]=='+' || temp[i+1]=='-' || temp[i+1]=='*' || temp[i+1]=='/'){
String number = stringBuffer.toString();
stringBuffer.setLength(0);
list.add(number);
}
}
}
}
for (String str: list){
System.out.print(str+" ");
}
}
这是输出:(234+(2*3))
234 2 3*+ 但当我将这些方法放在连接到FXML文件的控制器类中的button的setOnAction方法中时:
@FXML
public void equalsPressed(){
calculator.parseExpression(formulaTextField.getText());
calculator.beginConvert();
}
这是输出:(234+(2*3))
线程“JavaFX应用程序线程”java.lang.RuntimeException中的异常:java.lang.reflect.InvocationTargetException
原因:java.lang.IndexOutOfBoundsException:索引:0,大小:0
位于model.Calculator.beginConvert(Calculator.java:60)
有人能给我解释一下为什么会这样吗?我非常感谢您能提供的任何帮助我不明白为什么您的测试版本可以工作,但是: 从
beginConvert()
方法可以看出,您有一个名为list
的实例字段。您可能会在某个地方初始化它(到空列表?)
parseExpression()
方法不会将任何元素添加到实例字段list
:它会创建一个同名的局部变量:
List<String> list = new ArrayList<String>();
与
list=newarraylist();
@FXML
public void equalsPressed(){
calculator.parseExpression(formulaTextField.getText());
calculator.beginConvert();
}
List<String> list = new ArrayList<String>();
List<String> list = new ArrayList<String>();
list = new ArrayList<String>();