JUST GO

[공통] 예외 본문

Java/학습내용

[공통] 예외

root_go 2022. 10. 12. 15:20

예외

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

Try-Catch문 예제

public class Main {
    public static void main(String[] args) {
        String text = "Hello";
        try {
            int num = Integer.parseInt(text); // parseInt 에 실패
            System.out.println("숫자 변환 완료 (" + num + ")");
        } catch (NumberFormatException ex) { // 실행
            System.out.println("숫자 변환 실패");
            return; 
        } finally { // 반드시 실행될 것을 보장받는다.
            System.out.println("작업 종료"); // 작업 종료 출력
        }
        System.out.println("잘 끝났는지 봐라");
    }
}
// 숫자 변환 실패
// 작업 종료
public class Main {
    public static void main(String[] args) throws Exception {
        String text = "sdfasasdfsdf";
        try {
            int num = Integer.parseInt(text); // parseInt 에 실패
            System.out.println("숫자 변환 완료 (" + num + ")");
            if (num < 0) {
                throw new Exception("음수는 싫은디");
            }
        } catch (Exception ex){
            ex.printStackTrace();
            System.out.println("뭔진 모르겠고 오류 발생함");
        } finally { // 반드시 실행될 것을 보장받는다.
            System.out.println(text); // Cannot resolve symbol 'num' 지역변수 -> 동일 스코프 / 상위 스코프
                                // num 사용 불가
            System.out.println("작업 종료"); // 작업 종료 출력
        }
        System.out.println("잘 끝났는지 봐라");
    }

2. 고의로 예외 던지기

  • throw 키워드를 활용하여 고의로 예외를 발생시킬 수 있다.
  • 아래 구조에서 [예외 타입]은 java.lang.Throwable 을 (종국에) 상속 받는 모든 타입을 의미한다.
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 인터페이스를 구현하는 객체의 선언부를 추가한다.
try ([Closeable 인터페이스를 구현하는 객체의 선언부]) {
	[안전하게 처리할 구현부]
} catch ([처리할 예외 변수 선언]) {
	[예외 발생시  취할 조치]
}

가령

try (Connection connection = DatabaseUtils.getConnection()) {
	try (PreparedStatement preparedStatement = connction.prepareStatement(...)) {
    	// ...
    }
} catch ([처리할 예외 변수 선언]) {
	// ...
}

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

'Java > 학습내용' 카테고리의 다른 글

[공통] 상속  (0) 2022.10.13
[공통] 열거형  (0) 2022.10.13
[클래스] Integer  (0) 2022.10.12
[공통] 메모리 구조  (0) 2022.10.12
[공통] 객체  (0) 2022.10.12