JavaFX 计算器 RPN - 方法调用后出现 RuntimeException

JavaFX calculator RPN - RuntimeException after method invocation

我正在尝试使用 JavaFX 和反向波兰表示法创建一个计算器。这个想法是使用 TextField 从用户那里读取输入,然后将常见的中缀形式转换为后缀形式,进行计算并通过按下按钮 "equals" 来呈现输出。我希望它能够对双打进行操作。从用户那里获取的示例公式是: ((234*(7-3))/2) 转换为后缀形式后,它应该如下所示:234 7 3 - * 2 /
在遇到一些麻烦之后,我设法做到了,但只是作为使用控制台的测试。 当我将它与以前构建的 JavaFX GUI 连接时,它会抛出运行时异常,我不知道为什么会这样。所以,我将 String 标记存储在 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+" ");
    }
}

我的后缀转换方法是这样的:

public void beginConvert(){
    convertToONP(list.get(0));
}

public void convertToONP(String current) {
    if (currIndex < list.size()) {
        String a;
        String c = current;
        if (c.equals("(")) {
            convertToONP(list.get(++currIndex));
            a = list.get(currIndex);
            convertToONP(list.get(++currIndex));
            ++currIndex;
            System.out.print(a+" ");
        } else {
            System.out.print(c+" ");
            ++currIndex;
        }
    }
}

当我 运行 在测试中使用这些方法时 class:

public class Test {
    /*
     *my methods methods
    */
    public static void main(String[] args) {
        Test test = new Test();
        String formula = "(234+(2*3))";
        test.parseExpression(formula);
        System.out.println();
        test.beginConvert();
    }
}

这是输出:
( 234 + ( 2 * 3 ) )
234 2 3 * +

但是当我将这些方法放在连接到 FXML 文件的控制器 class 中按钮的 setOnAction 方法中时:

@FXML
public void equalsPressed(){
    calculator.parseExpression(formulaTextField.getText());
    calculator.beginConvert();
}

这是输出:
( 234 + ( 2 * 3 ) )

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at model.Calculator.beginConvert(Calculator.java:60)

有人可以向我解释为什么会这样吗?非常感谢您提供的任何帮助

我不明白为什么你的测试版本有效,但是:

beginConvert() 方法看来,您有一个名为 list 的实例字段。您可能会在某处初始化它(到一个空列表?)。

parseExpression()方法不向实例字段添加任何元素list:它创建一个同名的局部变量:

List<String> list = new ArrayList<String>();

然后解析表达式并将元素添加到本地列表。实例字段 list 从未在 parseExpression().

中被修改

所以(虽然无法确定,但没有看到完整的示例),您可能打算在 parseExpression() 中初始化 实例变量 。替换

List<String> list = new ArrayList<String>();

list = new ArrayList<String>();