2013-08-06 3 views
-5

각 프로그램에 대해 말하자면, 메소드 호출 수가 무한하거나 빠를 것이고 이유를 설명하십시오. 블로흐 (Bloch)와 같은 예입니다 - Java Puzzlers # 45StackOverFlowError + 재귀 재밌는 트릭

1) 

    public static void main(String[] args) 
     { 
     try 
     { 
      main(args); 
     } 
     catch(StackOverflowError e) 
     { 
      main(args); 
     } 
    } 

2) 

    public static void main(String[] args) 
     { 
     try 
     { 
      main(args); 
     } 
     catch(StackOverflowError e) 
     { 
      main(args); 
     } 
       finally 
       { 
         main(args); 
       } 
    } 

알아 두어야 할 점이 있습니다. 예를 들어 JVM의 스택 깊이는 1024입니다.이 프로그램을 실행하면 Main 메서드가 1024 번 호출되고 StackOverflowError가 발생하고 main 메서드가 다시 호출되는 catch 블록으로 이동합니다. 그래서 어느 수준의 깊이에 있습니까? 1024? 1023? 1025 ?? 또는 첫 번째 스택이 채워지고 다른 스택이 만들어지고 0부터 시작됩니까? 어떻게 작동합니까? 마침내 두 번째 예에서도 막을 수 있을까요?

+2

왜 그냥 사용해 보지 않으시겠습니까? –

+2

정말로 블로흐를 읽지는 않을 것입니다. - Java Puzzlers # 45 – OxomHuK

+0

finally 블록에 예외가 발생하면 finally 블록 밖으로 던져 질 것이고 이전에 catch에서 던져진 예외를 대체 할 것입니다. 또한 "첫 번째 스택이 채워진 다음 다른 스택이 만들어집니다"라는 질문은 의미가 없습니다. 지정된 호출 경로에는 하나의 호출 스택 만 있습니다. –

답변

1

첫 번째 예제에서는 전체 함수를 실제로 호출하지 않는 것처럼 처리합니다. 기본적으로 메서드 호출이 이루어지며 스택 오버플로가 발생하면 동일한 메서드 호출이 수행됩니다. 분명히 첫 번째 호출에서 스택 오버플로가 발생하면 아무 것도 변경되지 않고 두 번째 호출에서 스택 오버플로가 발생합니다.이 오버플로는 캐치되지 않으며 예외가 표시됩니다. 본질적으로, 호출하는 메소드가 스택을 오버플로하면 메서드 호출 수가 유한합니다. 이제 메서드 호출은 항상 자신을 호출하기 때문에 메서드는 어떤 시점에서 스택을 오버플로 할 것이고 이전에 입증 한 바 때문에 메서드 호출 수가 유한합니다.

이제 컴퓨터 프로그래밍에 대한 수학적 사고 방식을 잘 적용 해 보았습니다.

두 번째 예제와 마찬가지로 finally 블록 때문에 예외 보고서 이전에 두 개의 스택 오버플로가 허용되며 동일한 논리로 인해 동일한 결과가 발생합니다.