我意识到这可能是,而且可能是一个非常愚蠢的问题,但对我来说,我是新手。无论如何,我正试图从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
答案 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]);