자바 generic stack을 이용한 사칙연산 계산코드인데 계속 NullPointerException 오류가 뜨네요

조회수 1482회

제네릭 스택을 사용한 사칙연산 코드인데 계속 저렇게 nullpointerexception 에러가 뜹니다. 아래는 전체 코드입니다. 이미지 }

import java.util.*;

class GStack<T> {
static int top;
Object [] stck;

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

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

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

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

public class fix {
private static int  PIS (String temp) {

  if(temp.equals("^")) return 4; //뭔가4같아서 내가 2에서 바꿈
  if(temp.equals("*")||temp.equals("/")) return 3;
  if(temp.equals("+")||temp.equals("-")) return 2;
  if(temp.equals(")")) return 1;
  if(temp.equals("(")) return 0;
  return 0;
}

private static int PIE (String temp) 
{

  if(temp.equals("(")) return 5; 
  if(temp.equals("^")) return 4;
  if(temp.equals("*")||temp.equals("/")) return 3;
  if(temp.equals("+")||temp.equals("-")) return 2;
  if(temp.equals(")")) return 1;
  if(temp.equals("=")||temp.equals(" "))return -1;
  return 0;
}

static String IntoPost(StringTokenizer st) 
{
  GStack<String> stringStack = new GStack<String>();

  int n=st.countTokens(); 

  ArrayList<String> a = new ArrayList<String>(n); 
  for(int i=0;i<n;i++) 
     {   
        String token=st.nextToken();
        try {
           Double.parseDouble(token);
           a.add(token);                
           System.out.print(token+" ");               

        } catch(NumberFormatException e) { }

     switch(token) {         
     case ")" :             
           while(!stringStack.equals("("))
              { 
                a.add(stringStack.peek());                     
                System.out.print(stringStack.pop()+" ");                        
              }               
           stringStack.pop();//"(" 남은 괄호 없애주기                        
           break;

     case "+" :case "*" : case "-" : case "/" : case "(": 
        if(PIS(stringStack.peek())>= (PIE(token)))
        {         
           while(stringStack.top!=0)
           {
                 a.add(stringStack.peek());               
              System.out.print(stringStack.pop()+" ");
           }            
        }                 
        stringStack.push(token);                
        break;

     case "=":             
        while(stringStack.top!=0)
        {               
          a.add(stringStack.peek());
          System.out.print(stringStack.pop()+" ");               
        }            
     }         
  }

  //ArrayList<String> 구분자로 합치기
  String Postfix = String.join("",a);
  return Postfix;   
}

static double Evaluation(String s) {
  GStack<Double> DoubleStack = new GStack<Double>();      
  StringTokenizer st = new StringTokenizer(s," ");      
  int n=st.countTokens();
  double temp=0;
  double op1,op2;

  for(int i=0;i<n;i++) {
     String token = st.nextToken();
     if((token.equals("+")==false)&&(token.equals("-")==false)&&
           (token.equals("*")==false)&&(token.equals("/")==false)) 
     {
        temp=Double.parseDouble(token) ;
        DoubleStack.push(temp);
     }
     else {
        op2=DoubleStack.pop();
        op1=DoubleStack.pop();

        switch(token) {
        case "+" :  DoubleStack.push(op1+op2); break;
        case "-" : DoubleStack.push(op1-op2); break;
        case "*" : DoubleStack.push(op1*op2); break;
        case "/" : DoubleStack.push(op1/op2); break;
        }
     }
  }
  return temp;
}



public static void main(String[] args) {

  Scanner in= new Scanner(System.in);      
  System.out.print("수식을 입력하시오");
  String Postfix = in.nextLine();
  StringTokenizer st = new StringTokenizer(Postfix,"+ *( /-)^=",true);
  String postFix= IntoPost(st);
  double result=   Evaluation(postFix);      
  System.out.print("    답 : "+ result);      
  in.close();
}

1 답변

  • 코드 한줄씩 따라가면서 읽다보면 어디서 null이 나오는지 알수 있습니다.

    수식을 입력하시오를 만나서 1+1이라고 넣었을때

    질문자님이 올려주신 에러를 똑같이 만날수 있는데요.

    IntoPost함수안에서 switch문에서

    if (PIS(stringStack.peek()) >= (PIE(token))) 이 구간을 보면

    stringStack.peek()할때 내부에서 top==0이면 null을 리턴하도록 되어있습니다. NullPointer가 발생하지 않도록 PIS함수안에서 String temp파라미터를 받을때 temp값이 null인지 아닌지를 체크하세요.

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

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

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

(ಠ_ಠ)
(ಠ‿ಠ)