线程“main”中的异常java.lang.NullPointerException虚拟堆栈类

时间:2014-03-29 00:53:08

标签: java

我正在尝试使用此类来评估后缀表达式,并且在测试时,它会在第32行抛出此异常,其中虚拟堆栈应该推送。

public class PostfixEval
{
  private IntStack s;

  public PostfixEval()
  {
    IntStack s = new IntStack();
  }

  public boolean isInteger(String s)
  {
    int i = 0;
    boolean isDigit = true;

    while(i < s.length() && isDigit)
    {
      isDigit = s.charAt(i) >= '0' && s.charAt(i) <= '9';
      i++;
    }
    return isDigit;
  }

  public int eval(String e)
  {
    String[] tokens = e.split("\\s+");


    for(int i=0; i<tokens.length; i++)
    {
      if(isInteger(tokens[i]))
      {
        s.push(Integer.parseInt(tokens[i]));
      }
      else 
      {
        int a,b,c;

        b = s.pop();
        a = s.pop();
        c = 0;

        char d = tokens[i].charAt(0);
        if(d == '+')
        {
          c = a + b;
        }
        else if(d == '-')
        {
          c = a - b;
        }
        else if(d == '*')
        {
          c = a*b;
        }
        else if(d == '/')
        {
          c = a/b;
        }
        else if(d == '%')
        {
          c = a%b;
        }
        else
        {
          System.out.println("Error");
          System.exit(0);
        }
        s.push(c);

      }
    }
  return s.peek();  

  }
}

我已经使用jgrasp来查看Integer.parseInt(tokens [i]))的评估结果并确认它是拆分字符串中的数字。当我尝试将我输入的数字推入push方法的参数时,它可以正常工作,那么为什么在使用PostfixEval推送时会出现null异常?

这是我的堆栈类。

public class IntStack implements StackIntADT
{
  // fields
  private int[] stk;
  private int sp;
  // constructors
  public IntStack()
  {
    sp = -1;
    stk = new int[10];
  }

  public IntStack( int s )
  {
    sp = -1;
    stk = new int[s];
  }

  // stack class methods

  public void push(int element)
  {
    if(!isFull())
    {
      sp++;
      stk[sp]=element;
    }
    else
    {
      System.out.println("Element" + element);
      System.exit(0);
    }

  }
  public int pop()
  {
    int rv = 0;
    if(!isEmpty())
    {
      rv = stk[sp--];
    }
    else
    {
      System.out.println(rv);
      System.exit(0);
    }
    return rv;
  }
  public int peek()
  {
    return stk[sp];
  }
  public boolean isEmpty()
  {
    return sp==-1;
  }
  public boolean isFull()
  {
    return sp==stk.length-1;
  }
  public int size()
  {
    return stk.length;
  }
  public String toString()
  {
    String s = "";
    for(int x=0;x<10;x++)
    {
      s = s + " " + stk[x];
    }
  return s;
  }
}

1 个答案:

答案 0 :(得分:2)

构造函数不应定义本地s变量(隐藏具有相同名称的成员变量)。永远不会为成员变量赋值。

将构造函数更改为:

public PostfixEval() {
    s = new IntStack();
}