2

我试图从 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

4 回答 4

2

您应该停在比 parsedOperands.length 少一的位置,因此您应该使用<,而不是<=

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

顺便说一句,有一个特殊的运算符 (++) 用于将数字加一。这段代码更短,但相当于上面的代码:

for (int index = 1; index < parsedOperands.length; index++)
于 2013-01-24T20:55:37.737 回答
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)
于 2013-01-24T20:55:35.237 回答
0

乐:

您的错误实际上在这里:

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) 也可以。

另请参阅以获取更多信息

于 2013-01-24T20:58:11.900 回答
0

数组中的每个元素parsedIntegers都是一个单字符串,所以当你使用 时charAt,它应该是charAt(0)

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

使用charAt(index)or charAt(index - 1)there 尝试读取单字符字符串的末尾并抛出StringIndexOutOfBoundsException你得到的。

但是,一个更强大的方法可能是使用Integer.parseInt这样你就可以拥有多位整数:

int multResult = Integer.parseInt(parsedIntegers[index - 1]) *
                 Integer.parseInt(parsedIntegers[index]);
于 2013-01-24T21:00:07.303 回答