[java] finally 블록을 사용하는 이유는 무엇입니까?

내가 알 수있는 한, 다음 코드 스 니펫은 모두 동일한 용도로 사용됩니다. 왜 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더 유용합니다.

finallyJVM 실패, 스레드 종료 등과 같은 일부 경우 에는 실행되지 않습니다.


답변

throw 될 수있는 예외에 관계없이 실행하려면 해당 코드가 필요하기 때문입니다. 예를 들어 일부 관리되지 않는 리소스를 정리해야 할 수 있습니다 ( ‘using’구문은 try / finally 블록으로 컴파일 됨).


답변

무슨 일이 있어도 코드를 실행하고 싶을 때가 있습니다. 예외 발생 여부입니다. 그런 다음 finally.