JUST GO
[공통] 예외 본문
예외
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 |