내가 알 수있는 한, 다음 코드 스 니펫은 모두 동일한 용도로 사용됩니다. 왜 finally
블록이 있습니까?
코드 A :
try { /* Some code */ }
catch { /* Exception handling code */ }
finally { /* Cleanup code */ }
코드 B :
try { /* Some code */ }
catch { /* Exception handling code */ }
// Cleanup code
답변
- 처리하지 않는 예외가 발생하면 어떻게됩니까? (잡지 않았 으면 좋겠다
Throwable
…) - try 블록 내부에서 돌아 오면 어떻게됩니까?
- catch 블록에서 예외가 발생하면 어떻게됩니까?
finally
블록이 있는지 확인합니다 그러나 당신이 그 블록 (명시 적으로 전체 프로세스를 중단하는 몇 가지 방법을 모듈로),이 실행 얻을 것이다를 종료합니다. 이는 결정 론적 리소스 정리에 중요합니다.
답변
(적어도 Java에서는 C #에서도 가능)가없는 try
블록 을 가질 수도 catch
있지만 finally
. 예외가 발생했을 때에 try
블록의 코드에서 finally
예외가 높은 곳을 던져 전에 블록이 실행됩니다 :
InputStream in = new FileInputStream("somefile.xyz");
try {
somethingThatMightThrowAnException();
}
finally {
// cleanup here
in.close();
}
답변
try 또는 catch 블록에서 발생하는 일과 관계없이 어쨌든 실행하려는 코드를 넣을 수 있습니다.
또한 다중 catch를 사용하고 있고 모든 catch 블록에 공통적 인 일부 코드를 넣으려면 여기에 넣을 수 있습니다. 그러나 try의 전체 코드가 실행되었는지 확인할 수는 없습니다.
예를 들면 :
conn c1 = new connection();
try {
c1.dosomething();
} catch (ExceptionA exa) {
handleexA();
//c1.close();
} catch (ExceptionB exb) {
handleexB();
//c1.close();
} finally {
c1.close();
}
답변
마지막으로 항상 실행되며, catch 후 코드는 그렇지 않을 수 있습니다.
답변
응용 프로그램이 강제로 닫혔더라도 실행해야하는 작업 (메모리 해제, 데이터베이스 닫기, 잠금 해제 등)이있을 것입니다. 이러한 코드 줄을 finally
블록 에 작성 하면 예외가 발생하거나 아니…
응용 프로그램은 스레드 모음 일 수 있으며 스레드를 Exception
종료하지만 전체 응용 프로그램은 아닙니다.이 경우 finally
더 유용합니다.
finally
JVM 실패, 스레드 종료 등과 같은 일부 경우 에는 실행되지 않습니다.
답변
throw 될 수있는 예외에 관계없이 실행하려면 해당 코드가 필요하기 때문입니다. 예를 들어 일부 관리되지 않는 리소스를 정리해야 할 수 있습니다 ( ‘using’구문은 try / finally 블록으로 컴파일 됨).
답변
무슨 일이 있어도 코드를 실행하고 싶을 때가 있습니다. 예외 발생 여부입니다. 그런 다음 finally
.