편집 기록

편집 기록
  • 프로필 nowp님의 편집
    날짜2019.12.10

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


    제네릭 스택을 이용하여 중위표기식을 후위표기식으로 변환한 다음 그 식을 출력하여 계산한 다음 답을 출력하는 코드를 작성 중인데, 표기법을 변환하는 과정에 있어서도 식이 그대로 출력되고, 계산하는 과정에서는 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);
    
        }
    
    }
    

  • 프로필 알 수 없는 사용자님의 편집
    날짜2019.12.09

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


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

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

    스택


    class GStack {

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

    }