[英]What causes this code to throw exception?
在尝试用 Java 创建遵循 BODMAS 规则来解决复杂数学表达式的计算器的一些不成功尝试中,我决定创建一个参数为字符串的方法很重要。 这种方法应该检测大括号和数学符号(即加号、时间、减号、除法、开括号和闭括号),并且应该将任何字符串 say temp转换为 double say temp2 ,除非temp为空(即"")。 然后,该方法以与参数中相同的顺序将temp2值和符号存储在对象列表中。 该方法考虑到,如果第一个字符是数字,则要放入列表中的第一个对象应该是从零到第一个符号的索引的参数子字符串的双精度值。 如果最后一个字符是列表最后一个索引处的数字,则等效。 上面的想法让我创建了下面的项目:
package maths.calculator;
import java.util.ArrayList;
public class NumGetter {
static String expression;
static ArrayList<Integer> preList = new ArrayList<>();
static ArrayList<Object> list = new ArrayList<>();
public static ArrayList<Object> getNumber(String num) {
expression = num;
try {
if (expression == null) {
expression = "";
}
if (expression == "") {
return list;
}
int condition = 0;
for (char chars : expression.toCharArray()) {
if (chars == '-' || chars == '+' || chars == '÷' || chars == '×' || chars == ')' || chars == '(') {
preList.add(condition);
}
condition++;
}
if (preList.size() != 0) {
System.out.println(preList);
if (expression.charAt(0) >= '0' && expression.charAt(0) <= '9') {
String local = expression.substring(0, preList.get(0));
list.add(Double.parseDouble(local));
}
for (int i = 0; i < (preList.size() - 1); i++) {
int min = preList.get(i);
int next = preList.get(i + 1);
String local = expression.substring(min + 1, next);
if (local.length() == 0) {
list.add(expression.charAt(min));
} else {
double temp = Double.parseDouble(local);
list.add(expression.charAt(min));
list.add(temp);
}
}
if (expression.charAt(num.length() - 1) >= '0' && expression.charAt(num.length() - 1) <= '9') {
condition = preList.get(preList.size() - 1);
String local = expression.substring(condition);
list.add(expression.charAt(condition));
list.add(Double.parseDouble(local));
}
} else {
list.add(Double.parseDouble(expression));
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
return list;
}
}
即使在我导入上面的类并调用方法 getNumber 之后,上面的代码看起来也足够令人满意,如下所示:
import java.util.ArrayList;
import maths.calculator.NumGetter;
public class Text {
public static void main(String[] args) {
System.out.println("(12+8)0");
String one = "(12+8)0";
ArrayList<Object> two = NumGetter.getNumber(one);
System.out.println(two.toString());
}
}
问题在于输出。 在每种情况下都会抛出异常。 通常对于上述情况,输出为:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 3 out of bounds for length 3
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
at java.base/java.util.Objects.checkIndex(Objects.java:373)
at java.base/java.util.ArrayList.get(ArrayList.java:425)
at maths.calculator.NumGetter.getNumber(NumGetter.java:43)
at demo.Text.main(Text.java:12)
(12+8)0
[0, 3, 5]
但是,当我将for (int i = 0; i < (preList.size() - 1); i++)
的迭代更改为for (int i = 0; i < (preList.size() - 2); i++)
,顺便说一下,这应该是不正确的,结果非常接近预期的答案:
at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.base/java.lang.Double.parseDouble(Double.java:549)
at maths.calculator.NumGetter.getNumber(NumGetter.java:51)
at demo.Text.main(Text.java:12)
(12+8)0
[0, 3, 5]
[(, 12.0, )]
请问可能出了什么问题...我非常需要你的好脑子。
以下是在for
循环的第二次迭代中抛出异常java.lang.StringIndexOutOfBoundsException: String index out of range: -1
的行:
String local = number.substring(++min, next); //line throwing exception
第一次迭代: number.substring(1, 1);
第二次迭代: number.substring(2, 1);
在第二次迭代中,它抛出异常,因为不允许substring
方法的 beginIndex 大于 lastIndex。 有关更多信息,请查看此处。
谢谢
好久不见。 我不敢相信最后一个错误出现在最后一个 if 块中:
String local = expression.substring(condition);
我认为应该是:
String local = expression.substring(condition+1);
感谢大家,尤其是@Andreas
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.