[java] java.lang.Error를 언제 잡을까요?

어떤 상황 java.lang.Error에서 애플리케이션을 포착해야 합니까?



답변

일반적으로 결코.

그러나 때로는 특정 오류를 포착해야합니다.

프레임 워크와 같은 코드를 작성하는 경우 (타사 클래스로드), 잡는 것이 현명 할 수 있습니다. LinkageError (클래스 정의 없음, 만족스럽지 않은 링크, 호환되지 않는 클래스 변경).

나는 또한의 서브 클래스를 던지는 어리석은 써드 파티 코드를 보았습니다 Error.

그건 그렇고,에서 복구 할 수 없는지 잘 모르겠습니다 OutOfMemoryError.


답변

못. 응용 프로그램이 다음 코드 줄을 실행할 수 있는지 확신 할 수 없습니다. 를 받으면 어떤 일이든 안정적으로 할 수 있다는 보장OutOfMemoryError없습니다 . RuntimeException을 잡아 예외를 확인했지만 오류는 확인하지 않았습니다.

http://pmd.sourceforge.net/rules/strictexception.html


답변

일반적으로 항상 java.lang.Error로그에 기록하거나 사용자에게 표시해야합니다. 저는 지원팀에서 일하며 프로그래머가 프로그램에서 무슨 일이 일어 났는지 말할 수 없다는 것을 매일 봅니다.

데몬 스레드가있는 경우 종료되는 것을 방지해야합니다. 다른 경우에는 응용 프로그램이 올바르게 작동합니다.

java.lang.Error최고 수준 에서만 잡을 수 있습니다.

오류 목록을 보면 대부분 처리 할 수 ​​있음을 알 수 있습니다. 예를 들어 a ZipError는 손상된 zip 파일을 읽을 때 발생합니다.

가장 일반적인 오류는 OutOfMemoryError및이며 NoClassDefFoundError, 대부분의 경우 런타임 문제입니다.

예를 들면 :

int length = Integer.parseInt(xyz);
byte[] buffer = new byte[length];

생성 할 수 OutOfMemoryError있지만 런타임 문제이며 프로그램을 종료 할 이유가 없습니다.

NoClassDefFoundError라이브러리가 없거나 다른 Java 버전으로 작업하는 경우 대부분 발생합니다. 프로그램의 선택적 부분 인 경우 프로그램을 종료해서는 안됩니다.

Throwable최상위 수준에서 포착 하고 유용한 오류 메시지를 생성하는 것이 좋은 생각 인 이유에 대한 더 많은 예를 제공 할 수 있습니다 .


답변

다중 스레드 환경에서 가장 자주 포착하고 싶어합니다! 당신이 그것을 잡으면 그것을 기록하고 전체 응용 프로그램을 종료하십시오! 그렇게하지 않으면 중요한 부분을 수행 할 수있는 일부 스레드가 죽고 나머지 응용 프로그램은 모든 것이 정상이라고 생각합니다. 그 중에서 원하지 않는 상황이 많이 발생할 수 있습니다. 가장 작은 문제 중 하나는 다른 스레드가 하나의 스레드가 작동하지 않아 일부 예외를 던지기 시작하면 문제의 원인을 쉽게 찾을 수 없다는 것입니다.

예를 들어, 일반적으로 루프는 다음과 같아야합니다.

try {
   while (shouldRun()) {
       doSomething();
   }
}
catch (Throwable t) {
   log(t);
   stop();
   System.exit(1);
}

어떤 경우에도 다른 오류를 다르게 처리하기를 원할 것입니다. 예를 들어 OutOfMemoryError에서는 애플리케이션을 정기적으로 닫을 수 있고 (일부 메모리를 확보하고 계속할 수도 있음) 다른 일부에서는 수행 할 수있는 작업이 많지 않습니다.


답변

아주 드물게.

스레드가 죽는 이유가있는 메시지를 발행하기 위해 스레드의 최상위 수준에서만 말하고 싶습니다.

이런 종류의 작업을 수행하는 프레임 워크에 있다면 프레임 워크에 맡기십시오.


답변

거의 없다. 오류는 응용 프로그램이 일반적으로 수행 할 수없는 문제로 설계되었습니다. 유일한 예외는 오류 표시를 처리하는 것이지만 오류에 따라 계획대로 진행되지 않을 수도 있습니다.


답변

Error발생하지 않아야하는 비정상적인 상태를 나타내 므로 일반적으로 잡히면 안됩니다. .

Error클래스에 대한 Java API 사양에서 :

An ErrorThrowable
합리적인 응용 프로그램이 포착하려고하지 않아야하는 심각한 문제를 나타내는 의 하위 클래스입니다 . 이러한 오류는 대부분 비정상 상태입니다. […]

메서드는 throws 절에서 메서드 실행 중에 throw 될 수 있지만 포착되지 않은 Error의 하위 클래스를 선언 할 필요가 없습니다. 이러한 오류는 발생해서는 안되는 비정상적인 조건이기 때문입니다.

사양에서 언급했듯이 Error는 가능성이있는 상황에서만 발생하며, Error발생시 응용 프로그램이 수행 할 수있는 작업이 거의 없으며 일부 상황에서는 Java Virtual Machine 자체가 불안정한 상태 (예 :VirtualMachineError )

an Error은 절에 Throwable의해 잡힐 수 있음을 의미 하는 하위 클래스 try-catch이지만 응용 프로그램이 비정상 상태에있을 때 실제로 필요하지는 않습니다.Error JVM에 의해 발생합니다.

Section 11.5 The Exception Hierarchy of the Java Language Specification, 2nd Edition 에도이 주제에 대한 짧은 섹션이 있습니다.