Java

SCJP 39번 문제 try ~ catch문의 finally

bang2001 2013. 7. 25. 15:46

QUESTION 39

Given:
31. // some code here
32. try {
33. // some code here
34. } catch (SomeException se) {
35. // some code here
36. } finally {
37. // some code here
38. }

Under which three circumstances will the code on line 37 be executed? (Choose three.)

A. The instance gets garbage collected.
B. The code on line 33 throws an exception.
C. The code on line 35 throws an exception.
D. The code on line 31 throws an exception.
E. The code on line 33 executes successfully.

Answer: BCE

-------------------------------------------------------------------------------------------

먼저 이 문제에 대한 해석을 하면 다음과 같다.
"위의 코드에서 37번 라인이 실행될 수 있는 상황에 대하여 옳은것은? (정답은 3개)"
라고 되어있습니다.

먼저 finally 문은 try ~ catch 문에 사용하는 것으로, Network나 혹은 IO에서 노드연결을 하였거나
DB연동을 위해서 Connection을 얻어왔을때 이러한 것들은 반드시 사용하고 난 이후에는 close()를 해야
합니다. 만약 close()를 하지 않는 경우 예상치 못한 문제가 발생할 수 있습니다. 설사 프로그램이 
종료된 이후라고 해도 문제가 일어날 수 있습니다.

때문에 이러한(close()와 같은 작업) 작업들은 반드시 이루어져야 하는데 만약 예외가 발생하여
프로그램에 Interrupt가 걸려서 수행하지 못할 수 있습니다. 이러한 경우를 예방하기 위해서
존재하는것이 바로 finally 입니다.

이 finally는 프로그램이 수행하는 도중 try ~ catch 문을 만나면 반드시 finally블럭을 수행하도록
되어있습니다. 조건문이나 반복문에서 사용하는 return, break, continue등으로도 막을 수 없으며
finally를 막는방법은 단 하나 프로그램을 종료(System.exit())와 같은 방법외에는 존재하지 않습니다.
(컴터 전원뽑기 이런거 말고....)

그럼 문제의 보기를 보겠습니다.

A. The instance gets garbage collected. : 객체가 가비지 컬렉터에 도달하였을때(즉 객체가 소멸할 때 입니다.)

전혀 관계가 없습니다. 따라서 A는 답이 아닙니다.

B. The code on line 33 throws an exception. : 33번 라인에서 예외가 발생하였을 때

예외가 발생해도 try ~ catch 문에 일단 실행하고 있는 이상 반드시 finally를 실행합니다. 이것때문에 finally가 있는거죠.

C. The code on line 35 throws an exception. : 35번 라인에서 예외가 발생하였을 때

이것도 finally가 실행이 됩니다. finally에 대해서 좀더 풀어서 해석하면 try블럭과 finally가 실행되기 전까지
실행한 코드에 대해서 예외가 발생하더라도 finally블럭 안에 있는 코드는 반드시 실행하겠다 라는 뜻이 됩니다.
실제로 예제로 테스트를 해보면 예외가 발생하면서 finally가 실행된 것을 볼 수 있습니다.

ex) ArithmeticException 이 발생되도록 유도하였습니다.

class ExceptionTest 
{
public static void main(String[] args) 
{
try
{
throw new RuntimeException();
}
catch (RuntimeException e)
{
ExceptionTest ins = new ExceptionTest();
ins.throwException(0);
}
finally
{
System.out.println("Hello World!");
}
}

public void throwException(int a) 
{
int b = 10/a;
}
}//////////////////////////////////////////////////////



위와 같은 그림에서 보시다 싶이 예외와 함께 finally블럭의 코드가 실행된 것을 볼 수 있습니다.
따라서 C번도 정답이고,

D. The code on line 31 throws an exception. : 31번 라인에서 예외가 발생하였을 때

이것은 finally가 실행되지 않습니다. 그 이유는 31번라인에서 예외가 발생하게 되면 Interrup가 걸리게 되어
더이상 하단의 코드는 실행하지 않게 됩니다. 그러면 try ~ catch 문을 수행하지 않게 되고,
따라서 finally문도 실행하지 않게 됩니다.

E. The code on line 33 executes successfully. : 33번 라인에서 수행이 성공적으로 이루어 졌을 때

finally 블럭에 있는 코드는 수행되지 않으면 문제가 생길 수 있기 때문에 finally문은 반드시 수행하도록 되어있습니다.
따라서 E번도 정답입니다.

따라서 이번 문제에 대한 답은 B C E 입니다.