2012-10-25 5 views
1

지금은 스택을 배우고 있습니다. 제 코드가 컴파일됩니다. 코드를 실행하면 디버그 println이 인쇄되지 않고 오류java.lang.OutOfMemoryError : Java 힙 공간 오류가 발생하는 이유는 무엇입니까?

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
at java.util.Arrays.copyOf(Arrays.java:2760) 
at java.util.Arrays.copyOf(Arrays.java:2734) 
at java.util.Vector.ensureCapacityHelper(Vector.java:226) 
at java.util.Vector.addElement(Vector.java:573) 
at java.util.Stack.push(Stack.java:50) 
at stacks.main(stacks.java:56) 

이 표시됩니다. 그것이 operatand없는 경우

import ch03.stacks.*; 

import java.util.*; 

public class stacks { 

public static void main (String []args){ 

    System.out.printf("Enter a math equation in reverse polish notation:\n"); 

    Stack<Double> pemdas = new Stack<Double>(); 

    Scanner input = new Scanner(System.in); 
    String in = input.next(); 

    double temp1, temp2, resultant = 0; 


    while(input.hasNext()){ 
     if(in == "+"){ 
     temp1 = pemdas.peek(); 
     pemdas.pop(); 
     temp2 = pemdas.peek(); 
     pemdas.pop(); 
     resultant = temp1 + temp2; 
     pemdas.push(resultant); 
     System.out.println(resultant); 
     } 

     if(in == "-"){ 
     temp1 = pemdas.peek(); 
     pemdas.pop(); 
     temp2 = pemdas.peek(); 
     pemdas.pop(); 
     resultant = temp1 - temp2; 
     pemdas.push(resultant); 
     System.out.println(resultant); 
     } 

     if(in == "*"){ 
     temp1 = pemdas.peek(); 
     pemdas.pop(); 
     temp2 = pemdas.peek(); 
     pemdas.pop(); 
     resultant = temp1 * temp2; 
     pemdas.push(resultant); 
     System.out.println(resultant); 
     } 

     if(in == "/"){ 
     temp1 = pemdas.peek(); 
     pemdas.pop(); 
     temp2 = pemdas.peek(); 
     pemdas.pop(); 
     resultant = temp1/temp2; 
     pemdas.push(resultant); 
     System.out.println(resultant); 
     } 

     else 
     pemdas.push(Double.parseDouble(in)); 
     System.out.println(resultant); 

     } 



    System.out.println("Answer:"+ resultant); 
    } 
} 

그래서 내가 먼저 내 스택에에 팝업, 다음 역 폴란드 표기법에서 정수의 문자열에 읽고 :

내 코드처럼 보인다. 적어도 그것이 내가하고 있다고 생각하는 것입니다. 어떤 도움이라도 대단히 감사합니다.

답변

1

스캐너 hasNext/다음을 잘못 사용하고 있습니다. 항상 각 next() 앞에는 hasNext()을 입력해야합니다.

코드에서 while 루프 앞에 next()을 호출합니다. 그런 다음 hasNext()의 리턴 값을 사용하여 while 루프를 종료합니다. 하지만 ... while 루프 내에서 결코 next()를 호출하지 않습니다. 따라서 hasNext()은 항상 true를 반환하며 무한 루프 상태입니다. 앞에서 설명한 피크 문제와 결합하여 메모리가 부족해질 때까지 스택이 커질 수 있습니다.

수정 사항은 간단합니다. 당신이 문자열을 수행하지 않는 것은 제대로 비교하기 때문에 불행하게도 프로그램이 여전히 작동하지 while 루프

Scanner input = new Scanner(System.in); 
double temp1, temp2, resultant = 0; 

while(input.hasNext()) { 
    String in = input.next(); 

hasNext()next() 오른쪽으로 이동. 교체 선은 같은 :

if (in == "+") 

if (in.equals("+")) 

과 희망이 그냥 오타했다. 문자열 비교에 ==를 사용하는 것이 왜 문제인지 이해할 수없는 경우 Java 평등을 검토해야합니다.

마지막으로 if 논리에 문제가 있습니다. 힌트 : 상호 배타적 인 경우를 처리하려면 다음과 같은 코드를 사용하십시오 :

if() 
{ 
} 
else if() 
{ 
} 
else if() 
{ 
} 
else 
{ 
} 
+0

great. 그러나 문자열의 동등 함은 의미가 있습니다. int double 또는 boolean과 비교할 수 없습니다. – user1093111

+0

스레드 "main"의 예외 java.lang.NumberFormatException : 입력 문자열의 경우 : "*" \t at sun.misc.FloatingDecimal.readJavaFormatString (FloatingDecimal.java:1222) \t at java.lang.Double.parseDouble (Double. java : 510) \t at stacks.main (stacks.java:65) – user1093111

+0

프롬프트에서 작업을 추가 할 때이 오류가 발생했다는 것을 친구가 알려 주셨습니다. – user1093111

3

실제로 입력에서 다음 문자를 제거하지 않으므로 peek()을 사용하고 있으므로 반복해서 반복됩니다. nextInt()이 필요합니다.

+0

모든 pemdas.peek()의 ​​경우? – user1093111

+0

예. 'peek()'은 입력의 다음 내용을 보면서 다음 입력으로 남겨 둡니다. –

+0

방금 ​​편집 했으므로 (지금은 double을 사용하고 있습니다), 두 배가 스택 pemdas에 추가되면 nextInt는 최상위 요소를 읽을 수 없습니다. 그럼 nextInt를 사용 하시겠습니까? – user1093111

관련 문제