Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX计算器RPN-方法调用后的运行时异常_Java_Javafx_Postfix Notation - Fatal编程技术网

JavaFX计算器RPN-方法调用后的运行时异常

JavaFX计算器RPN-方法调用后的运行时异常,java,javafx,postfix-notation,Java,Javafx,Postfix Notation,我正在尝试使用JavaFX和反向波兰符号创建一个计算器。其思想是使用TextField从用户处读取输入,然后将公共中缀形式转换为后缀形式,进行计算,然后按“等于”按钮显示输出。我希望它能做双打手术。来自用户的公式示例如下: ((234*(7-3))/2) 转换为后缀形式后,它应该如下所示:234 7 3-*2/ 在经历了一些麻烦之后,我成功地做到了这一点,但只是作为一个使用控制台的测试。 当我将其与以前构建的JavaFXGUI连接时,它会引发运行时异常,我不知道为什么会发生这种情况。因此,我将字

我正在尝试使用JavaFX和反向波兰符号创建一个计算器。其思想是使用TextField从用户处读取输入,然后将公共中缀形式转换为后缀形式,进行计算,然后按“等于”按钮显示输出。我希望它能做双打手术。来自用户的公式示例如下: ((234*(7-3))/2) 转换为后缀形式后,它应该如下所示:234 7 3-*2/
在经历了一些麻烦之后,我成功地做到了这一点,但只是作为一个使用控制台的测试。 当我将其与以前构建的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>();