我正在Net-beans JFrame中制作计算器,并使用Stack来帮助计算输入的变量。我似乎已经运行到这个错误StringIndexOutOfBounds: 0,我似乎无法弄清楚如何解决它,当它发生。每当我按下启动Stack的equal按钮时,错误就会弹出。我认为我的堆栈有问题,但我又不能弄清楚。我真的需要一些新的人来关注这件事。
我使用/导入swing和。awts,但我不认为它们会给我错误。
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import static java.lang.Math.round;
import java.util.NoSuchElementException;
import java.util.Scanner;
import javax.swing.JFileChooser;
这是我的堆栈:
public class StackCalc
{
private LinkedList stackList = new LinkedList();
private int top, maxTop;
public Object removedEle;
public Object topEle;
public StackCalc(int mt)
{
maxTop=mt;
top=-1;
}
public boolean isFull()
{
return top == maxTop-1;
}
public boolean push (Object O)
{
if(!isFull())
{
stackList.addFirst(O);
top++;
return true;
}
else
{
return false;
}
}
public boolean pop()
{
if(!stackList.isEmpty())
{
removedEle= stackList.removeFirst();
top--;
return true;
}
else
{
return false;
}
}
public void getTop()
{
topEle=stackList.getFirst();
}
public boolean isEmpty()
{
return stackList.isEmpty();
}
}
这是我认为导致这个错误的代码
static void processExpR(String exp)
{
boolean advance = true;
String token = " ";
int loc = exp.indexOf(token);
while (loc != -1)
{
if (token.isEmpty()){
return;
}
else if (advance){
token = exp.substring(0,loc);
exp = exp.substring(loc+1);
}
char ch = token.charAt(0);//there is a specific problem with this line
if(Character.isDigit(ch)){
advance = true;
s1R.push(token);
}
else
{
if(s2R.isEmpty())
{
advance = true;
s2R.push(token);
}
else
{
advance = false;
calcR();
}
}
if(advance){
loc = exp.indexOf(" ");
}
}//end of while
if (Character.isDigit(exp.charAt(0)))
{
s1R.push(exp);
}
else
{
s2R.push(exp);
}
while (!s2R.isEmpty())
{
calcR();
}
}
任何帮助都将非常感激。我真的迷路了。谢谢你!
问题来了:
token = exp.substring(0,loc);
上面这行取exp的一个子字符串。
char ch = token.charAt(0);//there is a specific problem with this line
发生的是:你从exp中剪切的字符串并存储到令牌中…空是。因此,当你试图访问该字符串的索引0时,你被告知:该字符串甚至没有索引0(并且只有当令牌为空时才会发生这种情况)。
因此这里的答案是双重的:
- 在调用charAt(someIndex)之前,你最好检查如果你的字符串实际上有索引
- 但是在你的情况下,单独检查是没有用的。
你看,你的问题基本上是你计算"子字符串"索引的逻辑可能是错误的。
我的建议是:坐下来,手动处理你输入的数据。含义:使用示例输入,手动执行程序。要理解计数器/索引变量是什么样的,要理解代码对其输入的实际操作。如果您发现这太麻烦,那么至少学习使用调试器来做这件事(但是手工做一两次仍然会告诉您50或100多个答案!)