자바 NullPointerException 해결을 어떻게 해야 좋을지 모르겠습니다.

조회수 597회

제네릭 스택을 이용하여 중위표기식을 후위표기식으로 변환한 다음 그 식을 출력하여 계산한 다음 답을 출력하는 코드를 작성 중인데, 표기법을 변환하는 과정에 있어서도 식이 그대로 출력되고, 계산하는 과정에서는 NullPointerException 오류가 발생합니다.

NullPointerException 관련해서 찾아봐도 답이 나오질 않아서 해결법을 질문하고자 합니다.

스택


class GStack<T> {

    int top;
    Object[] stck;

    public GStack() {
        top = 0;
        stck = new Object[100];
    }

    public void push(T item) {
        if (top == 100)
            return;
        stck[top] = item;
        top++;
    }

    public T pop() {
        if (top == 0)
            return null;
        return (T) stck[top--];
    }

    public T peek() {
        if (top == 0)
            return null;
        return (T)stck[top];
    }

}

메인


public class postfixCalc {

    public static int priority(char op) {
        if(op == '+' || op == '-')
            return 1;
        else if(op == '*' || op == '/')
            return 2;
        else
            return 3;
    }

    public static void main(String[] args) {
        GStack<Character> opStk = new GStack<>(); // 연산자를 저장할 스택
        ArrayList exp = new ArrayList(); //중위표기 수식을 저장할 ArrayList
        exp.add(2.0); exp.add('+'); exp.add(3.0); exp.add('*'); exp.add(2.0); exp.add('('); exp.add('('); exp.add(3.0); exp.add('-');
        exp.add(2.0); exp.add(')'); exp.add('*'); exp.add(4.0); exp.add(')'); exp.add('+'); exp.add(5.0); exp.add('=');
        ArrayList expr = new ArrayList(); //후위표기 수식을 저장할 ArrayList


        /************중위순회식->후위순회식 변환***************/
        for(int i=0; i<exp.size(); i++) {
            if(exp.get(i) == "(")  //여는 괄호 '('일 경우 스택에 넣는다.
                opStk.push((Character) exp.get(i));

            else if(exp.get(i) == "+" || exp.get(i) == "-" || exp.get(i) == "*" || exp.get(i) == "/") {
                if(priority((char) exp.get(i)) >= priority(opStk.peek())) { //현재 연산자가 스택에 들어있는 연산자보다 우선순위가 높거나 같을 때
                    expr.add(opStk.pop()); //들어있던 연산자를 뺀 후
                    opStk.push((char)exp.get(i)); //현재 위치의 연산자를 집어넣는다
                }
                else
                    opStk.push((char)exp.get(i)); //그렇지 않으면 그냥 연산자를 집어넣는다.
            }

            else if(exp.get(i) == ")") { //닫는 괄호를 만난다면
                while(opStk.top != '(') 
                    expr.add(opStk.pop()); //여는 괄호를 만날 때까지 출력           
            }

            else
                expr.add(exp.get(i)); //연산자가 아니라면(피연산자라면) 바로 출력
        }

        while((opStk.top != 0))     //순회가 끝나면 스택에 남은 것을 전부 꺼냄.
            expr.add(opStk.pop());


        for(int j=0; j<expr.size(); j++) {
            System.out.print(expr.get(j));
        }


        /*******************후위표기식 계산*******************/

        double result;
        GStack<Double> vStk = new GStack<>(); //피연산자를 저장할 스택

        for (int i=0; i<expr.size(); i++) {
            if(expr.get(i) instanceof Double) { //피연산자면 스택에 push
                vStk.push((Double) expr.get(i));
            }

            else if(expr.get(i) == "+" || expr.get(i) == "-" || expr.get(i) == "*" || expr.get(i) == "/") { //연산자면 pop 2회 하여 피연산자끼리 해당 연산 후 스택에 push
                double d1 = vStk.pop();
                double d2 = vStk.pop();
                if(expr.get(i) == "+")
                    vStk.push((d2+d1));
                if(expr.get(i) == "-")
                    vStk.push((d2-d1));
                if(expr.get(i) == "*")
                    vStk.push((d2*d1));
                if(expr.get(i) == "/")
                    vStk.push((d2/d1));
            }

            else
                System.out.print(" ");
        }

        result = vStk.pop(); //스택에 남은 마지막 값이 결과, 여기서 NullPointerException

        System.out.print(result);

    }

}

  • 질문과 같은 상황에서 NPE 가 발생하는 것은 런타임중 스택내 원소가 없는겁니다. 이런경우. 즉 런타임 오류는 디버거로 라인 단위로 한줄씩 실행해가면서 변수값을 보면 비교적 쉽게 원인을 알 수 있습니다. 타인이 뭐가 잘못되었다 알려주면 질문자껜 하나도 도움이 되지 않습니다. NPE 는 간단한 경우이니 직접 디버깅 해보시기 바랍니다. 정영훈 2019.12.9 14:51

1 답변

  • 디버깅 해보시고 해당 코드를 예외처리문으로 바꾸시는것도 추천드립니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)