바와 같이 이미 답 ,이 코드를 실행하는 것이 가능하고, 특히 잡는 후, 함수를 호출 할 수 StackOverflowError
는 JVM의 절차를 처리하는 일반적인 예외가 사이의 스택 풀릴 때문에 throw
하고 catch
사용하는 스택 공간을 확보, 점. 그리고 당신의 실험은 그것이 사실임을 확인합니다.
그러나 이는 일반적으로 .NET Framework 에서 복구 할 수 있다고 말하는 것과는 다릅니다 StackOverflowError
.
A는 StackOverflowError
-A IS VirtualMachineError
IS-AN, Error
. 지적했듯이 Java는 다음에 대한 모호한 조언을 제공합니다 Error
.
합리적인 응용 프로그램이 포착하려고 시도해서는 안되는 심각한 문제를 나타냅니다.
그리고 당신은 합리적 으로 어떤 상황에서는 잡는 것이 괜찮을지도 모른다고 생각 해야 한다고 결론을 내립니다 Error
. 한 번의 실험을 수행한다고해서 일반적으로 안전하게 수행 할 수있는 작업이 있다는 것을 보여주지는 않습니다. Java 언어의 규칙과 사용하는 클래스의 사양 만이이를 수행 할 수 있습니다. Java 언어 사양 및 Java 가상 머신 사양 이이 예외의 의미에 대한 정보를 제공 VirtualMachineError
하기 때문에 A 는 예외의 특수 클래스입니다 . 특히 후자는 다음 과 같이 말합니다 .
Java Virtual Machine 구현 VirtualMethodError
은 내부 오류 또는 리소스 제한으로 인해이 장에 설명 된 의미를 구현하지 못하는 경우 클래스의 하위 클래스 인스턴스 인 객체를 throw합니다 . 이 사양은 내부 오류 또는 리소스 제한이 발생할 수있는 위치를 예측할 수 없으며보고 할 수있는시기를 정확하게 지정하지 않습니다. 따라서 VirtualMethodError
아래에 정의 된 모든 서브 클래스는 Java Virtual Machine이 작동하는 동안 언제든지 throw 될 수 있습니다.
...
StackOverflowError
: Java Virtual Machine 구현은 스레드에 대한 스택 공간이 부족합니다. 일반적으로 스레드가 실행 프로그램의 결함으로 인해 제한되지 않은 수의 재귀 호출을 수행하기 때문입니다.
중요한 문제는 어디에서 언제 StackOverflowError
던질 지 "예측할 수 없다"는 것입니다. 던지지 않을 위치에 대한 보장 은 없습니다 . 예를 들어 메소드에 대한 항목 에 던져지는 것에 의존 할 수 없습니다 . 메서드 내의 한 지점 에서 throw 될 수 있습니다 .
이 예측 불가능 성은 잠재적으로 재앙입니다. 메서드 내에서 throw 될 수 있으므로 클래스가 하나의 "원자 적"작업으로 간주하는 일련의 작업을 통해 부분적으로 throw되어 개체가 부분적으로 수정되고 일관성이없는 상태로 남습니다. 개체가 일관성이없는 상태에 있는 경우 해당 개체를 사용하려고하면 잘못된 동작이 발생할 수 있습니다. 모든 실제 경우에 어떤 개체가 일관성이없는 상태 인지 알 수 없으므로 신뢰할 수있는 개체가 없다고 가정해야 합니다. 모든 예외가 때문에 잘못된 행동을 할 수 잡은 후 복구 작업이나 시도는 계속합니다. 할 수있는 유일한 안전한 것은하는 것이다 되지 를 잡을StackOverflowError
, 오히려 프로그램이 종료되도록 허용합니다. (실제로 당신은 문제 해결을 돕기 위해 몇 가지 오류 로깅을 시도 할 수 있습니다,하지만 당신은 할 수없는 의존 제대로 작동하는 로깅). 즉, 당신은 안정적으로 복구 할 수 있습니다StackOverflowError
.