2013-03-02 7 views
2

전에 마지막으로 밖으로 인쇄 이유를 다음 코드 예를 들면 :궁금 캐치 예외

try{ 
    //here happens a SQLException 
} 
catch(SQLException e){ 
    throw new InstantiationException(); 
} 
finally{ 
    System.out.println("This is the finally"); 
} 

코드의이 비트의 결과는 최초이자 유일한이 InstantiationException를 출력 한 후 "This is the finally"을 인쇄 할 것입니다 ...

+1

[The finally Block] (http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html)을 읽어보십시오. – mre

+0

'throw'는 새 스레드를 시작해야합니다. '캐치 '에서 그것을하는 것이 이치에 맞습니까? –

답변

3

Java Language Specification:에서 :

이 try 블록의 실행이 갑자기 때문에 완료되면 V의 런타임 타입의 캐치 절을 잡을 예외 클래스와 호환 과제 인 경우

(시도 절에서 의 SQLException 던져) : 값 V의 던지기의 다음 선택의 여지가 try 문이 있으면 첫 번째 (가장 왼쪽) catch 절이 선택됩니다. 값 V는 선택된 catch 절의 매개 변수에 할당 된 이고 해당 catch 절의 블록 이 실행됩니다. 그런 다음 선택이 있습니다 :

catch 블록이 정상적으로 완료되면 finally 블록은 이 실행됩니다. 그런 다음 선택이 있습니다 :

finally 블록이 정상적으로 완료되면 try 문의 이 정상적으로 완료됩니다.

어떤 이유에서든 finally 블록이 갑자기 완료되면 동일한 이유로 try 문이 갑자기 완료됩니다.

이유 블록 R에 따라 catch 블록이 갑자기 완료되면 마지막으로 블록이 실행됩니다. (있는 InstantiationException 던져)

finally 블록이 정상적으로 완료되면, 다음 try 문 갑자기 이유 R. (에서 System.out.println ("이것은 마지막이다")에 대한 완료된 : 그럼 선택의 여지가있다)

각 실행 단계를 굵게 표시했습니다.

는 요약 :

  1. SQLException이 당신의 try 블록 마침내없는 InstantiationException에게
  2. 을 던져으로
  3. 캐치 절 갑자기 완료
  4. 되는 SQLException을 처리하는 조항을 캐치로 전송
  5. 컨트롤에서 발생합니다 텍스트를 인쇄하여 블록을 실행합니다.
+1

tnx 많은 시간을 보냅니다. 훨씬 더 명확하게 지금 – Rollerball

+0

@ Rollerball 당신은 환영합니다 :) – PermGenError