-
1. 예외(Exception)처리 방법
try { // 예외가 발생할 여지가 있는 코드영역 } catch (예외종류 참조변수) { // 예외가 발생하면 처리할 내용 } finally { // try-catch 블록이 끝나면 무조건 실행되는 영역 }
앞서 말했듯이, 예외는 예상 가능한 문제를 말한다. 그리고 우리는 위의 코드를 사용하여 예상 가능한 문제에 대한 대응을 할 수 있다. 위 코드에서 기억해야 할 점은, try 블록에서 예외가 발생하지 않으면 finally 블록만을 실행하고, try 블록에서 예외가 발생하면 catch 실행 후 finally 블록을 실행한다는 점이다.
아래의 예시를 보자.
위의 내용은 try-catch를 사용하지 않고 NullPointerException이 발생하는 코드인데, array가 null값을 가지고 있는데, 해당 array에서 값을 참조하려고 하니 NPE가 발생한 것이다. 우리는 이 문제를 해결하기 위해서 아래와 같이 try-catch 구문을 사용해야한다.
우리는 위의 문제를 해결하기 위해 try-catch-finally를 사용했다. 그리고 예상 예외는 NullPointerException이니, NPE를 잡아 달라고(catch해달라고) try-catch문에 문의를 한다. 그러면 위와같이 NPE가 발생하면 catch문이 잡아내게 되고, catch문 안에 있는 "예외 상관없이 수행 됨"이라는 결과를 출력되고, 프로그램이 정상적으로 계속 동작한 것을 확인할 수 있다.
참고) 일반 예외가 발생하는 경우
실행 예외가 아니라 "일반 예외"의 경우(실행 예외와 일반 예외가 구분이 안된다면 https://strange-developer.tistory.com/33을 참고하자), 이클립스에서 "예외가 발생하니 예외처리 하세요"라고 알려준다. 따라서 대부분의 경우에는 실행 예외에 대해 신경을 많이 쓰게된다. 그냥 지나가는 이야기로 말하는거니 참고로만 알아두자.
2. 다중 Catch
예외를 처리할 때에는 보통 try-catch문을 쓴다고 알고있지만, 예외가 발생하는 경우 다른 메서드에게 떠넘기는 방법도 존재한다.(실제 개발업무에는 이 방법을 많이 쓰는거같다) 그리고 이 때 사용할 수 있는 키워드는 throws이다. throws 키워드는 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 자신을 호출한 메서드에게 떠넘기는 역할을 한다.
public class ThrowsExample { public static void main(String[] args) { try { findClass(); } catch (ClassNotFoundException e) { System.out.println("클래스가 존재하지 않습니다."); } } public static void findClass() throws ClassNotFoundException { Class clazz = Class.forName("java.lang.String2"); } }
위의 코드에서 특징적인 부분은 public static void findClass() throws ClassNotFoundException에서 throws ClassNotFoundException이며, 해당 메서드에는 try-catch문이 존재하지 않고, 실제 try-catch문은 다른 메서드에 존재함을 인지하자.
그리고 코드를 실제로 실행시키게 되면, "클래스가 존재하지 않습니다" 라는 결과를 띄우게 되고, 프로그램을 정상종료된다. 즉, findClass에서 ClassNotFoundException이 발생하게 되면, findClass는 자신을 호출한 메서드에게 예외를 throws(영어로 "던져라"라는 뜻) 한다. 그리고, findClass를 호출한 것은 main메서드이므로 main메서드에 있는 try-catch문에 의해 에러가 잡히며 "클래스가 존재하지 않습니다"라는 출력문을 발생시키고 정상종료된다.
3. 예외정보 얻는 방법
우리는 예외를 얻기위해 getMessage()와 printStackTrace() 메서드를 활용할 수 있다.
이 getMessage()와 printStackTrace()는 Exception 클래스 안에 있는 메서드이기 때문에, catch문 내부에서 사용가능하다.(이 getMessage()와 printStackTrace()는 구체적인 예외 로그를 확인하는 도구라고 생각하면 될거같다)
public class PrintStackTraceExample { public static void main(String[] args) { System.out.println(1); try { System.out.println(2); System.out.println(3/0); System.out.println(4); } catch (ArithmeticException e) { e.printStackTrace(); System.out.println("예외메시지 : " + e.getMessage()); } System.out.println(6); } }
실행결과
여기서 주의깊게 봐야할 것은 빨간글씨의 "/ by zero" 부분이다. 우리가 printStackTrace()를 사용하지 않았다면 "/ by zero"라는 문자가 나타나지 않아서 우리가 직접 코드를 보고 예외가 왜 발생했는지 예상해야 한다. 하지만, printStackTrace() 덕분에 구체적으로 어떤 에러가 발생했는지 확인 가능하기 때문에 우리는 좀 더 예외에 대해 빠르게 대처할 수 있게된다.
'개발언어 > Java' 카테고리의 다른 글
Java Exception (0) 2020.03.16 [Java 기초] Stream - 1 (0) 2019.05.26 [Java 기초] 멀티 스레드 - 1 (2) 2019.05.13 [번역] Java 8의 동시성(Concurrency) (0) 2019.05.01