ArrayDeque的堆栈实现中的NullPointerException

时间:2013-04-19 05:09:01

标签: java nullpointerexception stack

嘿大家正在编写一个程序,使用堆栈将中缀表达式转换为后缀表达式,其中输入是从用户读入的。问题是堆栈为空的情况我继续在调用peek()的代码段上获得nullpointer异常。令人困惑的是,我有一个if语句,应该使用对isEmpty()的调用来防止这种情况发生。有任何想法吗?具体来说,输入“A + B-C”是给我带来问题的,尽管“(A + B-C)”完美无缺

import java.util.*;
/**
 *
 * @author Adam
 */
public class PostfixConversion
{
    static Deque<Character> stack = new ArrayDeque<>();

    public static boolean precedence(char first, char second)
    {
        if(first == '+' || first == '-')
            return false;
        else if(first == '*' || first == '/')
        {
            if(second == '*' || second == '/')
                return false;
            else
                return true;
        }
        else
            return false;
    }

    public static String convertToPostfix(String infixExp)
    {
        int leftCount = 0;
        int rightCount = 0;
        Character item;

        String rightError = "There is no matching left parenthesis.";
        String leftError = "There is no matching right parenthesis.";
        String postFix = "";

        if(infixExp.indexOf(")") < infixExp.indexOf("("))
            return rightError;
        if(infixExp.lastIndexOf(")") < infixExp.lastIndexOf("("))
            return leftError;

        for(int i = 0; i < infixExp.length(); i++)
        {
            if(Character.isLetter(infixExp.charAt(i)))
                postFix += infixExp.charAt(i);

            if(infixExp.charAt(i) == '(')
            {
                item = infixExp.charAt(i);
                stack.push(item);
                leftCount++;
            }

            if(infixExp.charAt(i) == ')')
            {
                while(stack.peek() != '(')
                    postFix += stack.pop().charValue();
                stack.pop();
                rightCount++;
            }

            if(infixExp.charAt(i) == '+' ||
                infixExp.charAt(i) == '-' ||
                 infixExp.charAt(i) == '*' ||
                  infixExp.charAt(i) == '/')
            {
                if(stack.isEmpty() == false)
                {
                    while(PostfixConversion.precedence(infixExp.charAt(i), stack.peek().charValue()) == false)
                    {
                        if(stack.peek().charValue() == '(')
                            break;
                        postFix += stack.pop().charValue();
                    }
                }

                item = infixExp.charAt(i);
                stack.push(item);
            }
        }

        if(leftCount > rightCount)
            return leftError;
        if(rightCount > leftCount)
            return rightError;

        return postFix;
   }
}

1 个答案:

答案 0 :(得分:0)

在以下循环中:

        while(stack.peek() != '(')
            postFix += stack.pop().charValue();

你不检查堆栈是否已经空了。

以下循环也是如此:

            while(PostfixConversion.precedence(infixExp.charAt(i), stack.peek().charValue()) == false)
            {
                if(stack.peek().charValue() == '(')
                    break;
                postFix += stack.pop().charValue();
            }

一旦堆栈变空,peek()将返回null,您将从自动装箱中获得NPE。

请注意,只有在输入循环之前,才会检查第二个if周围的while 。它不会在任何后续迭代中进行检查,因此不会阻止我上面描述的场景。