[英]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.