Java JFrame字符串索引超出界限错误

时间:2016-11-09 19:34:09

标签: java swing netbeans jframe

我在Net-beans JFrame中创建一个计算器,并使用Stack来帮助计算输入的变量。我似乎已经遇到了这个错误StringIndexOutOfBounds:0,我似乎无法弄清楚当它发生时如何解决它。每当我按下启动堆栈的相等按钮时,弹出错误。我觉得我的Stack有问题,但我又想不通了。我真的需要一些新的眼睛。

我使用/导入了摆动和.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;

这是我的Stack:

   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();  
       }   
    }

非常感谢任何帮助。我真的迷失在这里。谢谢。

1 个答案:

答案 0 :(得分:1)

问题出现在这里:

token = exp.substring(0,loc);

以上行从exp获取子字符串。稍后你会这样做:

char ch = token.charAt(0);//there is a specific problem with this line

发生的情况是:您从 exp 中删除并存储到令牌中的字符串为空。因此,当您尝试访问该字符串的索引0时,您会被告知:该字符串甚至没有索引0(只有当令牌 为空<时才会发生这种情况/ EM>!)。

因此,答案是双重的:

  1. 在执行charAt(someIndex)之类的调用之前,如果您的字符串 指数
  2. ,则最好检查
  3. 但在你的情况下,单独检查不会有帮助。
  4. 你知道,你的问题基本上就是你的逻辑如何计算你的&#34;子串&#34;索引可能是错误的。

    我的建议:坐下来,手动处理输入数据。含义:使用示例输入,并手动执行您的程序。要了解计数器/索引变量的外观,了解代码在输入时的实际操作。如果你发现这太麻烦了,至少要学习使用调试器来做这件事(但是这样做一次,手动两次仍会告诉你超过50或100个答案!)