[Java] 예외처리(try-catch문, throw~)

1. 일반 예외처리(Try-Catch 문)
▫ 예외가 발생할 것으로 예상되는 구문을 안전하게 처리하기 위해 사용한다.

try {
[안전하게 처리할 구현부]
} catch ([처리할 예외 변수 선언]) {
[예외 발생시 취할 조치]
}

혹은 아래와 같이 처리할 예외의 종류를 분리하여 사용할 수 있다.

try {
[안전하게 처리할 구현부]
} catch ([처리할 예외 1 변수 선언]) {
[예외 1 발생시 취할 조치]
} catch ([처리할 예외 2 변수 선언]) {
[예외 2 발생시 취할 조치]
} catch ([처리할 예외 3 변수 선언]) {
[예외 3 발생시 취할 조치]
}

서로 다른 종류의 두 개 이상의 예외에 대해 동일한 조치를 취하기 위해 아래와 같이 작성한다.

try {
[안전하게 처리할 구현부]
} catch ([처리할 예외 변수 선언 | 처리할 예외 2 변수 선언 | ...]) {
[예외 발생시 취할 조치]
}
▫ finally키워드를 이용하여 try-catch문에서 try가 정상 실행되었든, 예외가 발생하여 catch가 실행되었든 반드시 실행을 보장 받을 구문을 별도로 작성할 수 있다. catch의 개수는 상관 없고, finally만 가장 마지막에 오면 됨.

try {
[안전하게 처리할 구현부]
} catch ([처리할 예외 변수 선언]) {
[예외 발생시 취할 조치]
} finally {
[반드시 실행을 보장 받을 구문]
}

아래는 예외가 발생하기 쉬운 부분을 처리하는 예제이다.

String str = "Hello";
int num = Integer.parseInt(str); // NumberFormatException 발생

String str = "Hello";
int num = -1;
try {
num = Integer.parseInt(str); // NumberFormatException은 발생하지만 'catch' 구문으로 이동함.
} catch (NumberFormatException ex) {
num = -1;
}
System.out.println(num); // -1



public class Main {
public static void main(String[] args) {
String text ="50";
try{
int num =Integer.parseInt(text);
System.out.println("숫자 변환 완료("+ num +")");
} catch (NumberFormatException ex){
System.out.println("숫자변환 실패");
return;
} finally {
System.out.println("작업종료");
}
System.out.println("잘 끝났는지 봐라");
}
}


2. 고의로 예외 던지기
▫ throw 키워드를 활용하여 고의로 예외를 발생시킬 수 있다.
throw [예외 객체화];
throw new [예외타입]([전달인자]?);
가령, "그냥 싫음"이라는 메세지를 담은 `Exception`을 발생 시키기 위해 아래와 같이 작성한다.
throw new Exception("그냥 싫음");

 

3. java.lang.Throwable의 구조
    - 자바에서 던질 수 있는(발생 시킬 수 있는) 것들의 종류는 두 개인데, 하나는 `Exception`이고, 하나는 `Error`이다. 이때, 이 두 타입은 모두 Throwable을 상속 받는다.
        - Exception일반적인 오류 전체를 의미한다. 상속 받아서 커스텀 예외를 만들기도 한다.
        - Error는 일반적이지 않은, 시스템적인 오류를 의미한다. 가령, 메모리가 부족하여 더 이상 프로그램이 실행될 수 없을 경우 OutOfMemoryError가 발생한다. 상속 받아서 커스텀 에러를 만들어서는 안 된다.

4. Try-With-Resource
    - java.io.Closeable java.lang.AutoCloseable 인터페이스를 구현하는 객체에 대해 반드시 close 메서드를 호출할 것을 강제하는 Try-Catch문이다.
    - 구조 : 일반 `Try-Catch`와 유사하게 쓰되, try 뒤에 Closeable 혹은 AutoCloseable 인터페이스를 구현하는 객체의 선언부를 추가한다.
     
      try ([Closeable 인터페이스를 구현하는 객체의 선언부]) {
          [안전하게 처리할 구현부]
       } catch ([처리할 예외 변수 선언]) {
           [예외 발생시 취할 조치]
       }
  
       가령
       try (Connection connection = DatabaseUtils.getConnection()) {
           try (PreparedStatement preparedStatement = connection.prepareStatement(...)) {
              // ...
          }
       } catch ([처리할 예외 변수 선언]) {
           // ...
       }
     

위 구조에서 Try-Catch문을 빠져 나갈 때 connection 객체에 대해 close 메서드를 호출할 것을 강제한다. (모든 상황에서)

'Back > Java' 카테고리의 다른 글

[Java] String 클래스  (0) 2023.02.09
[Java] 배열과 열거형  (0) 2023.02.09
[Java] Integer 클래스  (3) 2023.02.08
[Java] 객체  (0) 2023.02.08
[Java] 일반 문법(반복문)  (0) 2023.02.08