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>();
我正在尝试使用 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>();