문제

크고 포괄적 인 캐치 블록에서 모든 오류를 포착하는 스레드가 있습니다. 신청서에서 예상되는 오류가 아니라 어떤 오류도보고 할 수 있도록이 작업을 수행합니다. 내 런 가능성은 다음과 같습니다.

public final void run()
{
    try
    {
        System.out.println("Do things"); /* [1] */

        doUnsafeThings();
    }
    catch (Throwable t)
    {
        System.out.println("Catch"); /* [2] */

        recover();
    }
    finally
    {
        System.out.println("Finally"); /* [3] */
    }
}

나는 NPE가 던질 수있는 캐치 블록으로 잡히기를 기대할 것이다. 대신, [2]의 출력은 인쇄되지 않으며 [3]도 인쇄되지 않습니다. [1]의 출력이 인쇄됩니다.

내가 콘솔에서 얻는 것은 다음과 같습니다.

Uncaught exception java/lang/NullPointerException.

도구에서 무슨 일이 일어나고 있습니까?

법원 기록의 경우 J2ME를 사용하고 있으며 Sun의 WTK v2.5.2 에뮬레이터에서 실행 중입니다.

나는 그것을 JVM 구현 도약에 적용하고 싶은 유혹을 받고 있지만, 내가 뭔가 빠진다 고 느끼는 것을 도울 수는 없습니다.

의심의 회피를 명확히하기 위해 (예제 코드가 제작 코드에서 분명히 변경되기 때문에)

  • 런 메소드에서 시도/캐치/마침내 블록 외부에는 아무것도 없습니다.
  • 각 블록의 시작 부분에 System.out.println이 있습니다.이 콘솔 문은 중요하지 않아야합니다.
도움이 되었습니까?

해결책

대답은 내가 바보라는 것이 밝혀졌습니다. 무엇이 잘못되었는지 설명하지만 "그 버그 중 하나"라고 부르겠습니다.

나는 런 가능성을 실행 한 스레드가 사용자 정의 스레드 클래스라는 것을 순간적으로 잊어 버렸다 (Nokia Bugs를 돌리기 위해). 그것은 불렀다 run() 반복적으로 a canWait() 방법.

Canwait 방법은 실패에 대한 책임이 있었고 실행은 전혀 실패하지 않았습니다. 이를 위해, 나는 콘솔 맹검을 가지고 있으며, 내 질문에서 일련의 사건을 완전히 잘못 인용했습니다.

다른 팁

시행 착오가 필요한 것 같습니다. 제안 할 수 있습니다 :

try {
    doEvilStuff();
} catch (NullPointerException ex) { 
    System.out.println("NPE encountered in body"); 
} catch (Throwable ex) {
    System.out.println("Regular Throwable: " + ex.getMessage());
} finally {
    etc...
}

NullPointerException을 명시 적으로 잡으면 예외가 Try Block 또는 Catch/MARCH/MARKING BLOCK 내에있는 경우 분명해야합니다.

좋아, 이것은 거친 추측이지만 ... 그것은 설명 할 것이다.

분명히 당신의 코드는 아닙니다 실제로 그 - 그래서 내 생각에 당신의 캐치 (또는 마지막으로) 블록이 무엇이든 로그인하기 전에 무언가를하고 있다는 것입니다. 또는 시도 블록과 다른 로거를 사용합니다. 어느 쪽이든, 나는 캐치 또는 마침내 블록이 예외를 던지고 있다고 생각합니다.

나는 당신이 스택 추적이 있다고 생각하지 않습니다 ...

편집 : 알겠습니다 System.out.println, 그것은 논쟁의 무언가입니까? 예를 들어:

catch (Throwable t) {
    // Will go bang if t.getCause() returns null
    System.out.println(t.getCause().getMessage());
}

단순한 경우 System.out.println("Constant") 그렇다면 매우 이상합니다.

당신은 (예 : Try Block의 로그 라인에서 나온) 시도 블록이 실제로 얼마나 멀리 얻는 지 알고 있습니까?

코드를 살펴보면 복구 ()가 예외를 던지는 것처럼 보이므로 Jon의 조언은 따라야합니다.

당신이 우리에게 스택 추적을 주면 더 나은 도움을받을 수 있습니다.

예외를 포착하려고 할 때 다음과 같은 일을합니다.

try {
  doSomethingBad();
} catch(Exception e) {
   try {
      LogException(...);
   } catch(Exception e) {}       
} finally {
}

나는 예외를 둥지하는 것을 좋아하지 않지만 캐치 블록 던지기 예외는 마음에 들지 않습니다.

당신이 언급했듯이 당신은 a를 사용하고 있습니다 Runnable - 이것은 당신이 여러 스레드를 사용하고 있다는 것을 의미합니까? 만약 doUnsafeThings() 내부적으로 다른 스레드를 다시 스폰하고 예외가 생성되면 캐치 블록이 스레드에서 얻지 못할 수 있습니다. 보다 http://java.sun.com/j2se/1.5.0/docs/api/java/lang/thread.ungaughtexceptionhandler.html

일반적으로 NullPointerException을 잡는 것은 나쁜 관행입니다.

프로그래머는 일반적으로 세 가지 상황에서 NullPointerException을 잡습니다.

The program contains a null pointer dereference. Catching the resulting exception was easier than fixing the underlying problem.
The program explicitly throws a NullPointerException to signal an error condition.
The code is part of a test harness that supplies unexpected input to the classes under test. 

이 세 가지 상황 중 마지막 상황 만 허용됩니다. 이 링크를 따릅니다.

NullPointerException을 잡습니다

다른 코드에 의해 스레드가 죽을 수 있습니까? 일반적으로 System.exit () 또는 유사한 무언가에 의해 스레드가 비정상적으로 종료되지 않는 한, 마지막으로 블록은 항상 실행됩니다.

  • 코드에서 올바른 위치를보고 있습니까? 즉, 스택 추적으로 보호하는 dounsafethings () 블록입니까?

  • 빌드 방법에 문제가 있고 이전 버전의 코드를 디버깅하고 있습니까?

dounsafethings ()에 로깅을 추가하기 만하면됩니다. 그 방법이 당신이 기대하는 일을하고 있는지 확인하려면 (예 : 마침내 시도하고 무언가를 기록하십시오)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top