관련 이론 및 문법

(try ~ catch ~ finally 참고)

http://kkikkodev.tistory.com/106


문제 의도

주어진 코드를 컴파일한 후 실행한 결과를 고르는 문제입니다.


답안

E


풀이 방법

먼저, main 메소드가 실행됩니다. try 구문 안의 test(); 라는 문장을 통해서, static 메소드인 test() 를 바로 호출합니다. test 메소드에서도, try 구문안의 문장들이 실행됩니다. 먼저, String 형 변수 x 에 null 값을 대입합니다. 그리고, x.toString() 을 화면에 출력하려고 합니다. 하지만, x 는 null 이기 때문에, 호출 가능한 메소드가 없어서, NullPointerException 이 발생하게 됩니다. 이 NullPointerException 은 RuntimeException 의 한 종류이기 때문에, 사실 따로 catch 문으로 처리하거나, throws 로 처리를 회피하지 않더라도 컴파일 오류는 나지 않습니다. 하지만, catch 문이나 throws 문이 있다면, 처리가 됩니다. 그러나, test 메소드에서는 catch 문이나, throws 문이 없습니다. 따라서, 아무 처리도 따로 하지 않고, test 메소드가 종료되어야 하는데, 뒷 부분에 finally 구문이 있기 때문에, 메소드 종료전, finally 구문을 실행합니다. 화면에 "finally " 를 출력하게 됩니다.


그 다음에, test 메소드를 호출한 쪽인 main 메소드의 test 메소드 호출부로 돌아갑니다. 이제는, main 메소드도 종료를 하려고 하는데, main 메소드에는, Exception 을 처리하는 catch 문이 존재하기 때문에, main 메소드를 종료하여, JVM 에게 예외처리를 넘기지 않고, catch 쪽에서 처리하게 됩니다. RuntimeException 인 NullPointerException 은 Exception 의 한 종류이기 때문에, 해당 catch 문은 NullPointerException 을 받아서 처리할 수 있습니다. catch 구문을 실행하고, 화면에 "exception " 을 출력합니다. 예외가 정상적으로 처리되었으니, main 메소드도 정상적으로 종료됩니다.


화면에는, "finally exception " 이 출력되고, 답안은 E 가 됩니다.


by kkikkodev 2016. 11. 20. 17:10