2013-01-24 62 views
2

我意識到這可能是,可能是一個非常愚蠢的問題,但裸露在我身邊,我是一個新手。無論如何,我正在嘗試從JOptionPane中讀取像3 + 9-2 * 10/5這樣的數學表達式,並獲得結果 - 當然,要考慮到操作順序。我將字符串拆分爲數字和只是使用String.split()的操作數,並創建了一個for循環來尋找乘號或除號 - 在這種情況下,它會先檢測字符串「*」,因爲它首先出現在字符串中。Java IndexOutOfBoundsException錯誤

public static void main(String[] args) 
{ 

    String mathString = JOptionPane.showInputDialog("Please type a simple math expression (i.e., without parentheses)."); 

    String[] parsedIntegers = mathString.split("\\D"); 
    String[] parsedOperands = mathString.split("\\d+"); 
    parsedOperands[0] = null; 
    System.out.println(Arrays.toString(parsedIntegers)); 
    System.out.println(Arrays.toString(parsedOperands)); 

     for (int index = 1; index <= parsedOperands.length; index = index + 1) 
     { 

      if (parsedOperands[index].equals("*")) 
      { 
       System.out.println("The multiplication sign is at index " + index + "."); 
       int multResult = Character.getNumericValue(parsedIntegers[index - 1].charAt(index - 1)) * Character.getNumericValue(parsedIntegers[index].charAt(index)); 
       System.out.println(multResult); 

      } 

     } 

} 

字符串數組parsedOperands看起來像這樣:[null,+, - ,*,/]。 字符串數組parsedIntegers看起來像這樣:[3,9,2,10,5]。但是,當我在parsedOperands中查找索引3處的「*」,然後嘗試乘以parsedIntegers中的(index-1)和(index)時,Java返回一個IndexOutOfBoundsException異常。爲什麼會發生?我錯過了什麼嗎?

以下是錯誤:

[3, 9, 2, 10, 5] 

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 2 

[null, +, -, *, /] 

The multiplication sign is at index 3. 
    at java.lang.String.charAt(String.java:658) 
    at programmingpractice.SolveMathExpression.main(SolveMathExpression.java:49) 
Java Result: 1 

回答

0

您的陣列parsedIntegers中的每個元素是一個單一字符串,因此當你使用charAt,它應該只是charAt(0)

int multResult = Character.getNumericValue(parsedIntegers[index - 1].charAt(0)) * 
       Character.getNumericValue(parsedIntegers[index].charAt(0)); 

使用charAt(index)charAt(index - 1)那裏試圖讀取過去的一個字符的字符串的結尾,並拋出你得到的StringIndexOutOfBoundsException

然而,一個更強大的方式來做到這一點可能是使用Integer.parseInt所以你可以多位數整數:

int multResult = Integer.parseInt(parsedIntegers[index - 1]) * 
       Integer.parseInt(parsedIntegers[index]); 
+0

非常感謝。我忽略了String [index] .charAt(index)正在查看位置索引的事實,而不是在我指向的字符串數組的索引的第一個字符.charAt(0)處 - 在此情況下爲String [指數]。 而不是它: parsedIntegers [index-1] .charAt(index-1)它應該被parsedIntegers [index-1] .charAt(0)。這就是爲什麼它給了我超出界限例外的指數。 – rsant023

1

您也正在考慮索引,其等於所述陣列的長度。即,您的陣列長度是4和您的for循環還檢查的,因爲你的條件(index <= parsedOperands.length;)

for (int index = 1; index <= parsedOperands.length; index = index + 1) 

在索引4的元素應該是

for (int index = 1; index <= parsedOperands.length-1; index = index + 1) 
2

你應該停止在一個小於parsedOperands。長度,因此,你應該使用<,不<=

for (int index = 1; index < parsedOperands.length; index = index + 1) 

順便說一下,有一個特殊的運算符(++),由一個增加了許多。此代碼是短,但等效於上面的一行:

for (int index = 1; index < parsedOperands.length; index++) 
+0

原來我也有在for循環IndexOutOfBoundsException異常,但我hadn沒有看到它,因爲第一個IndexOutOfBoundsException相遇是在charAt()。 – rsant023

0

LE:

你的錯誤實際上是在這裏:

int multResult = Character.getNumericValue(parsedIntegers[index - 1].charAt(index - 1)) * Character.getNumericValue(parsedIntegers[index].charAt(index)); 

您應該使用

int multResult = Integer.valueOf(parsedIntegers[index - 1]) * Integer.valueOf(parsedIntegers[index]); 

這使得你可以使用盡可能多的數字。

但其餘的依然存在。 Java數組基於0。 重寫你for聲明如下:

for (int index = 1; index < parsedOperands.length; index++)

其實最後一部分,index++,只是一些看起來更好(至少對我來說),因爲你還變種(index = index + 1)就可以了。

另見this進一步的信息

相關問題