Java IndexOutOfBoundsException错误

时间:2013-01-24 20:53:08

标签: java indexoutofboundsexception

我意识到这可能是,而且可能是一个非常愚蠢的问题,但对我来说,我是新手。无论如何,我正试图从JOptionPane读取一个数学表达式,如3 + 9-2 * 10/5,并得到它的结果 - 当然考虑到操作的顺序。我使用String.split()将字符串拆分为数字和操作数,并创建一个寻找乘法符号或除法符号的for循环 - 在这种情况下,它检测字符串“*”,因为它首先出现在字符串中。

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

4 个答案:

答案 0 :(得分:2)

你应该停在比parsedOperands.length更少的一个,因此你应该使用<,而不是<=

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

顺便说一句,有一个特殊的运算符(++)用于将数字增加一个。此代码较短,但与上面的代码相同:

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

答案 1 :(得分:1)

您还在考虑索引,该索引等于数组的长度。即,您的数组长度为4,并且您的for循环还会检查索引4处的元素,因为您的条件为( index <= parsedOperands.length;)

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

应该是

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

答案 2 :(得分: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了解更多信息

答案 3 :(得分: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]);