2016-11-09 3 views
0

Я делаю калькулятор в Net-beans JFrame и использую Stack для расчета вычисленных переменных. Кажется, я столкнулся с этой ошибкой StringIndexOutOfBounds: 0, и я не могу понять, как ее решить, когда это произойдет. Всякий раз, когда я нажимаю кнопку равенства, которая инициирует стек, появляется сообщение об ошибке. Я думаю, что что-то не так с моим стеком, но опять-таки я не могу понять. И мне действительно нужны свежие глаза.Java JFrame String Index Out of Bounds Error

Я использовал/импортировал качели и .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(); 
     } 
    } 

Любая помощь будет высоко ценится. Я действительно потерялся здесь. Спасибо.

+0

Добавить полный стек Следите за своим сообщением. –

ответ

1

Проблема возникает здесь:

token = exp.substring(0,loc); 

выше строка принимает подстроку из эксп. Чуть позже вы:

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

И что происходит это: строка, которую вырезают из ехр и хранить в лексем ... это пустой. И поэтому, когда вы пытаетесь получить доступ к индексу 0 этой строки, вам говорят: эта строка даже не имеет индекса 0 (и это может произойти, только если токен - пустой!).

Таким образом, ответ здесь два раза:

  1. Перед выполнения вызовов, как Шар (someIndex) лучше чека заранее, если ваша строка фактически имеет что индекс
  2. Но в вашем случае, проверка сама по себе не помогла бы.

Вы видите, ваша проблема в том, что ваша логика, как вы вычисляете свой индекс подстроки, вероятно, неверна.

Мое предложение: сесть и обработать свои входные данные вручную. Значение: используйте пример ввода и вручную выполните свою программу. Чтобы понять, как выглядят ваши счетчики/индексные переменные, чтобы понять, что ваш код действительно делает с его вводом. Если вы обнаружите, что это слишком громоздко, чем, по крайней мере, изучите использование отладчика , чтобы сделать это (но делать это один, два раза вручную будет по-прежнему сообщать вам более 50 или 100 ответов здесь на SO!)

+0

Спасибо, GhostCat, я попробую это –