我正在尝试使用允许将中缀翻译为postfix express的应用程序。我只能用一个数字来做,但是当我为整个实数做这个时,它会显示错误!
public String doTrans() {
for (int j = 0; j < input.length(); j++) {
char ch = input.charAt(j);
theStack.displayStack("For " + ch + " ");
switch (ch) {
case '+':
case '-':
gotOper(ch, 1);
break;
case '*':
case '/':
gotOper(ch, 2);
break;
case '(':
theStack.push(ch);
break;
case ')':
gotParen(ch);
break;
default:
if (input.charAt(j + 1) != '+' || input.charAt(j + 1) != '-'
|| input.charAt(j + 1) != '/'
|| input.charAt(j + 1) != '('
|| input.charAt(j + 1) != ')')
number = number + ch;
else
output = output + number;
break;
}
}
while (!theStack.isEmpty()) {
theStack.displayStack("While ");
output = output + theStack.pop();
}
theStack.displayStack("End ");
return output;
}
这就是错误!
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 14
at java.lang.String.charAt(String.java:658)
at InToPost.doTrans(InToPost.java:33)
at InfixApp.main(InfixApp.java:15)
if (input.charAt(j + 1) != '+' || input.charAt(j + 1) != '-'...
整个程序很长,我不能在这里发布!
最后编辑
default:
if (j != input.length() - 1) {
if (input.charAt(j + 1) != '+'
|| input.charAt(j + 1) != '-'
|| input.charAt(j + 1) != '/'
|| input.charAt(j + 1) != '('
|| input.charAt(j + 1) != ')')
number = number + ch;
else
output = output + number;
} else
output = output + number;
break;
答案 0 :(得分:1)
您的循环执行此操作:
for (int j = 0; j < input.length(); j++) {
...
以后再做
if (input.charAt(j + 1) != '+' || input.charAt(j + 1) != '-'
要实现此功能,您的循环必须以input.length() - 1
结束,否则您将在最后一次迭代中获得StringIndexOutOfBoundsException
。
答案 1 :(得分:0)
在这一行
if (input.charAt(j + 1) != '+' || input.charAt(j + 1) != '-'
你正在检查下一个角色。但是,如果你已经在最后呢?这就是你在String
结束时的运行方式。在测试下一个字符之前,您需要分别检测此情况(字符串结尾)。
答案 2 :(得分:0)
if (input.charAt(j + 1) != '+' || input.charAt(j + 1) != '-'
|| input.charAt(j + 1) != '/'
|| input.charAt(j + 1) != '('
|| input.charAt(j + 1) != ')')
number = number + ch;
else
output = output + number;
一个简单的元素是||这里应该是&amp;&amp;因为!=。
可能一切都应该是:
number += ch;
答案 3 :(得分:0)
if (input.charAt(j + 1) != '+' || input.charAt(j + 1) != '-'
|| input.charAt(j + 1) != '/'
|| input.charAt(j + 1) != '('
|| input.charAt(j + 1) != ')')
以上代码查找下一个字符(如果它是操作符)。
你的for循环一直持续到input.length(),所以只需让循环去一个比这个位置小的END:
for(int j = 0; j&lt; input.length() - 1; j ++)//所以循环代码可以安全地引用最后一个字符。