1. 오류 Error
- 발생하면 복구하거나 되돌릴 수 없는 심각한 상황.
- 발생상황 예시 : 메모리부족, 메서드끼리 호출을 무한반복등등.
- 처리방법 : 오류를 발생하는 요인을 찾아서 업애는 디버깅.
- 예방법 : 코드 짜임새있게 짜기.
즉, 프로그램을 잘 짜는 것만이 대안이기때문에 예외처리와 무관하다.
2. 예외 Exception
- 오류와 비교하면 심각도가 낮으며 프로그램의 정상적인 흐름을 방해하는 상황.
- 발생상황 예시 : 네트워크 연결 끊기는 상황, 해당 파일을 읽지 못하는 상황등등.
- 예외처리란 : 예외가 발생했을때 비정상적인 종료를 막고 계속해서 사용할 수 있도록 처리하는 것
- 예외처리 라이브러리 = 최상위 클래스 = Throwable
- RuntiomeException = unchecked Exception : 중간에 throws 할 필요없다
- 그 외 예외 = checked Exception
3. 예외 처리 기법
3-1. try catch finally구문
- 단축키 : ctrl + space
- try catch finally :
- finally블록은 무조건 실행. 예외 발생 여부와 상관없이 반드시 실행되어야하는 내용을 작성.
- 심지어 return문을 만날때에도 먼저 finally 블록을 실행 후 메서드가 리턴된다.
- finally 주요 목적 : try블록에서 사용한 시스템 자원(System Resource)의 반납처리.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public class TryCatchFinallyFlow {
public static void main(String[] args) { int num = new Random().nextInt(2); try{ System.out.println("코드1 : "+ num); int i = 1/num; System.out.println("랜덤숫자 1일경우 예외없음"); return; } catch (ArithmeticException e){ System.out.println("랜덤숫자0일경우 예외처리완료"); } finally { System.out.println("코드4 : 파이널리 항상 실행"); } System.out.println("코드5"); }
}
코드1 : 1 랜덤숫자 1일경우 예외없음 코드4 : 파이널리 항상 실행
코드1 : 0 랜덤숫자0일경우 예외처리완료 코드4 : 파이널리 항상 실행 코드5
|
3-2. Exception 객체 정보 활용
참고링크 : Throwable 메서드
- getMessage()사용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class SimpleException { public static void main(String[] args) { int[] intArr = {10}; try { System.out.println(intArr[2]); } catch (Exception e) { System.out.println("예외발생 - 배열확인필요 : "+ e.getMessage()); } System.out.println("프로그램을 종료합니다."); } }
예외발생 - 배열확인필요 : 2 프로그램을 종료합니다.
|
- printStackTrace()사용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class SimpleException { public static void main(String[] args) { int[] intArr = {10}; try { System.out.println(intArr[2]); } catch (Exception e) { e.printStackTrace(); } System.out.println("프로그램을 종료합니다."); } }
java.lang.ArrayIndexOutOfBoundsException: 2 프로그램을 종료합니다. at ch9.SimpleException.main(SimpleException.java:8)
|
3-3. try with resources 구문
- try catch finally 코드가 길다.
- 따라서 java 7버전에서 새롭게 추가된 기능이 try with resources구문이다.
1 2 3 4 5
| try (리소스타입1 res1 = 초기화; 리소스타입2 res2 = 초기화; ...){ }catch(Exception e){ }
|
4. throws 키워드를 통한 예외처리 위임
예외 처리의 두번째방법은 throws 키워드를 통한 위임 또는 전달이다.
- throws 키워드
- throws는 메서드에서 처리해야 할 하나 이상의 예외를 메서드를 호출한 곳으로 던져버린다.
- 이러한 위임은 처리와는 다름.
- 첫번째 방법이었던 try catch 에서 catch블록은 예외를 처리해서 없애 버림
- BUT 위임은 예외를 없애지 못하고 그냥 호출한 곳으로 예외를 전달만 함.
- 예외를 전달받은 메서드는 다시 예외 처리 책임이 발생함.
- throws를 왜 사용할까?
- 항상 try catch로 처리하는 것은 좋지않다
- WHY? 특히 API나 다른 모듈에서 사용되는 기능을 제공하는 경우 예외를 전달해서 그 예외에 대해 적절히 대응할 수 있는 코드를 작성할 수 있게 해줄 필요가 있기때문이다.
- 예 : 어떤 프로그램을 install할때
5. 사용자 정의 예외
- 예외가 unchecked exception계열이면 중간에 throws절차가 필요없다. (ex : runtiomeException)
- 고급스러운 코딩이 가능하다.
6. throw와 throws 차이
둘 다 Exception을 발생시키지만 큰 차이가 있다.
- throws : 예외를 위임하는 예약어
- throw : 억지로 예외를 발생시키는 예약어, 즉 사용자 정의에 의한 exception = 인위적인 exception이다.
- 생성자에 exception을 넣으면 예외 문구로 출력된다.
1
| throw = new throw("나만의 예외메세지");
|