[JAVA]예외처리기법3가지 및 Error와 Exception 차이

1. 오류 Error

  • 발생하면 복구하거나 되돌릴 수 없는 심각한 상황.
  • 발생상황 예시 : 메모리부족, 메서드끼리 호출을 무한반복등등.
  • 처리방법 : 오류를 발생하는 요인을 찾아서 업애는 디버깅.
  • 예방법 : 코드 짜임새있게 짜기.
    즉, 프로그램을 잘 짜는 것만이 대안이기때문에 예외처리와 무관하다.

2. 예외 Exception

  • 오류와 비교하면 심각도가 낮으며 프로그램의 정상적인 흐름을 방해하는 상황.
  • 발생상황 예시 : 네트워크 연결 끊기는 상황, 해당 파일을 읽지 못하는 상황등등.
  • 예외처리란 : 예외가 발생했을때 비정상적인 종료를 막고 계속해서 사용할 수 있도록 처리하는 것
  • 예외처리 라이브러리 = 최상위 클래스 = Throwable

https://deftkang.tistory.com/44

  • 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일경우 출력값 - return때문에 코드5출력되지않음
코드1 : 1
랜덤숫자 1일경우 예외없음
코드4 : 파이널리 항상 실행

//랜덤숫자가 0일경우 출력값
코드1 : 0
랜덤숫자0일경우 예외처리완료
코드4 : 파이널리 항상 실행
코드5

3-2. Exception 객체 정보 활용

참고링크 : Throwable 메서드

  1. 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
프로그램을 종료합니다.
  1. 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 키워드를 통한 위임 또는 전달이다.

  1. throws 키워드
  • throws는 메서드에서 처리해야 할 하나 이상의 예외를 메서드를 호출한 곳으로 던져버린다.
  • 이러한 위임은 처리와는 다름.
  • 첫번째 방법이었던 try catch 에서 catch블록은 예외를 처리해서 없애 버림
  • BUT 위임은 예외를 없애지 못하고 그냥 호출한 곳으로 예외를 전달만 함.
  • 예외를 전달받은 메서드는 다시 예외 처리 책임이 발생함.
  1. 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("나만의 예외메세지");