gpt4 book ai didi

java - 是什么导致这段代码抛出异常?

转载 作者:太空宇宙 更新时间:2023-11-04 09:15:28 24 4
gpt4 key购买 nike

在一些不成功的尝试中,我尝试在 java 中创建一个遵循 BODMAS 规则来求解复杂数学表达式的计算器,我认为创建一个参数为字符串的方法非常重要。这样的方法应该检测大括号和数学符号(即 plustimesminusdivideopenclose brackets),并且应该将上述任意两个符号之间的任何字符串 temp 转换为 double temp2,除非 temp 为空(即“”)。然后,该方法按照与参数中相同的顺序将 temp2 值和符号存储在对象列表中。该方法考虑到,如果第一个字符是数字,则要放置在列表中的第一个对象应该是参数从零到第一个符号的索引的子字符串的 double 值。如果最后一个字符是列表最后一个索引处的数字,则执行等效操作。上述想法引导我创建了以下项目:

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);//抛出异常的行

第一次迭代:number.substring(1, 1);

第二次迭代:number.substring(2, 1);

在第二次迭代中,它抛出异常,因为substring方法的beginIndex不允许大于lastIndex。更多信息请查看here .

谢谢

关于java - 是什么导致这段代码抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59081731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com