새로운 코드를 검토 중입니다. 이 프로그램에는 try와 finally 블록 만 있습니다. catch 블록이 제외되었으므로 예외 또는 throw 가능한 항목이 발생하면 try 블록이 어떻게 작동합니까? finally 블록으로 직접 이동합니까?
새로운 코드를 검토 중입니다. 이 프로그램에는 try와 finally 블록 만 있습니다. catch 블록이 제외되었으므로 예외 또는 throw 가능한 항목이 발생하면 try 블록이 어떻게 작동합니까? finally 블록으로 직접 이동합니까?
답변:
try 블록의 코드 중 하나라도 확인 된 예외를 throw 할 수있는 경우 메서드 서명의 throws 절에 나타나야합니다. 확인되지 않은 예외가 발생하면 메서드에서 버블 링됩니다.
finally 블록은 예외 발생 여부에 관계없이 항상 실행됩니다.
try
/ 에 대한 작은 참고 사항 finally
: finally는
System.exit()
호출됩니다.try{}
블록 결코 끝 (예를 들면 무한 루프).try{..} catch{ throw ..} finally{..}
? 나는 마지막으로 실행되지 않습니다 생각
Java 언어 사양 (1)try-catch-finally
은 실행 방법을 설명합니다 . 캐치가없는 것은 주어진 Throwable을 캐치 할 수없는 것과 같습니다.
- 값 V가 던져 져서 try 블록의 실행이 갑자기 완료되면 다음과 같은 선택이 있습니다.
- 런타임 유형 V를 try 문의 catch 절의 매개 변수에 할당 할 수있는 경우
……- 런타임 유형 V를 try 문의 catch 절의 매개 변수에 할당 할 수없는 경우 finally 블록이 실행 됩니다. 그런 다음 선택이 있습니다.
- finally 블록이 정상적으로 완료되면 V 값이 발생하여 try 문이 갑자기 완료됩니다.
- finally 블록이 이유 S로 인해 갑자기 완료되면 try 문이 이유 S로 인해 갑자기 완료됩니다 (그리고 값 V의 throw는 삭제되고 잊혀집니다).
내부 finally는 외부 블록에 예외를 던지기 전에 실행됩니다.
public class TryCatchFinally {
public static void main(String[] args) throws Exception {
try{
System.out.println('A');
try{
System.out.println('B');
throw new Exception("threw exception in B");
}
finally
{
System.out.println('X');
}
//any code here in the first try block
//is unreachable if an exception occurs in the second try block
}
catch(Exception e)
{
System.out.println('Y');
}
finally
{
System.out.println('Z');
}
}
}
결과
A
B
X
Y
Z
finally 블록은 try 블록이 정상적으로 종료되거나 예외로 인해 비정상적으로 종료되는지 여부에 관계없이 항상 try 블록이 종료 된 후에 실행됩니다.
try 블록 내의 코드에 의해 예외가 throw되면 현재 메서드는 finally 블록을 실행 한 후 동일한 예외를 다시 throw (또는 계속 throw)합니다.
finally 블록이 예외 / 오류 / throwable을 throw하고 이미 보류중인 throwable이있는 경우 추악합니다. 솔직히 말해서 나는 정확히 무슨 일이 일어나는지 잊어 버렸습니다. 내가 생각하는 두 throw 가능 객체가 서로 연결 얻을,하지만 당신이해야 할 몇 가지 특별한 부두가있다 (예 - 내가 찾아 볼 것 메소드 호출)은 "마지막으로"이렇게 되신, 어, 토하기 전에 원래의 문제를 얻을 수 있습니다.
덧붙여서, try / finally는 자바가 소멸자가 없기 때문에 리소스 관리를 위해 매우 일반적인 일입니다.
예-
r = new LeakyThing();
try { useResource( r); }
finally { r.release(); } // close, destroy, etc
"마지막으로"하나 더 팁 : 당신이 경우 않는 캐치에 넣어 귀찮게 어느 캐치 특정 (예상) 던질 수있는 서브 클래스, 아니면 그냥 캐치 '의 Throwable " 하지 일반적인 포괄 오류 트랩"예외 ". 리플렉션 구프와 같은 너무 많은 문제는 "예외"가 아닌 "오류"를 발생 시키며 다음과 같이 코딩 된 "모두 잡기"에 의해 바로 미끄러집니다.
catch ( Exception e) ... // doesn't really catch *all*, eh?
대신 다음을 수행하십시오.
catch ( Throwable t) ...
버전 7 이전의 Java 버전에서는 이러한 세 가지 조합의 try-catch-finally ...
try - catch
try - catch - finally
try - finally
finally
블록은 try
or / and catch
블록 에서 무슨 일이 일어나 든 항상 실행 됩니다. 따라서 catch
블록 이 없으면 여기서 예외가 처리되지 않습니다.
그러나 물론 응용 프로그램이 완전히 중단되는 것을 원하지 않는 한 코드 어딘가에 예외 처리기가 여전히 필요합니다. 핸들러가 정확히 어디에 있는지는 애플리케이션의 아키텍처에 따라 다릅니다.
- Java try 블록 뒤에 catch 또는 finally 블록이 와야합니다.
- 각 try 블록에는 0 개 이상의 catch 블록이있을 수 있지만 finally 블록은 하나만 있습니다.
- finally 블록은 프로그램이 종료되면 (System.exit ()를 호출하거나 프로세스를 중단시키는 치명적인 오류를 유발하여) 실행되지 않습니다.
그 프로그램으로 시도하지 않습니까? finally 블록으로 이동하여 finally 블록을 실행하지만 예외는 처리되지 않습니다. 그러나 그 예외는 finally 블록에서 무시할 수 있습니다!
try
블록 안에 예외를 던질 수있는 코드를 작성합니다. catch
우리가 예외를 처리 곳 블록이다. finally
블록에 관계없이 항상 예외가 발생 여부 실행되지 않습니다.
이제 try-catch-finally 블록 대신 try-finally 블록이있는 경우 예외가 처리되지 않고 제어 대신 try 블록이 catch 블록 이후에 finally 블록으로 이동합니다. 예외로 아무것도하지 않으려면 try-finally 블록을 사용할 수 있습니다.