예외 처리
예외 처리
오류란 무엇인가?
컴파일 오류(compile error)
프로그램 코드 작성 중 발생하는 문법적 오류
실행 오류(runtime error)
실행 중인 프로그램이 의도하지 않은 동작을 하거나(bug) 프로그램이 중지되는 오류
실행 오류시 비정상 종료는 서비스 운영에 치명적
오류가 발생할 수 있는 경우에 로그(log)를 남겨 추후 이를 분석하여 원인을 찾아야 함
자바는 예외 처리를 통하여 프로그램의 비정상 종료를 막고 log를 남길 수 있음
오류와 예외 클래스
시스템 오류(error)
가상 머신에서 발생, 프로그래머가 처리할 수 없음
동적 메모리 없는 경우 , 스택 오버 플로우 등
예외(Exception)
프로그램에서 제어할 수 있는 오류
읽어 들이려는 파일이 존재하지 않는 경우, 네트워크 연결이 끊어진 경우
예외 클래스의 종류
모든 예외 클래스의 최상위 클래스는 Exception
다양한 예외 클래스가 제공됨
try-catch-finally 문
finally 에서 프로그램 리소스를 정리함
try { } 블록이 실행되면 finally { } 블록은 항상 실행됨
리소스를 정리하는 코드를 각 블록에서 처리하지 않고 finally에서 처리함
try{
예외가 발생할 수 있는 부분
}catch(처리할 예외 타입 e) {
예외를 처리하는 부분
}finally {
항상 수행되는 부분
}
try-with-resources 문
리소스를 자동 해제 하도록 제공해주는 구문
자바 7부터 제공됨
close()를 명시적으로 호출하지 않아도 try { } 블록에서 열린 리소스는 정상적인 경우, 예외 발생한 경우 모두 자동 해제됨
해당 리소스가 AutoCloseable을 구현하고 있음
FileInputStream의 경우 AutoCloseable을 구현하고 있음
향상된 try-with-resources 문
자바 9에서 제공되는 구문
외부에 선언된 리소스도 변수만 사용가능
// 자바 9 이전
AutoCloseObj obj = new AutoCloseObj();
try(AutoCloseObj obj2 = obj){
thorow new Exception();
}catch(Exception e) {
System.out.println("예외 부분입니다.");
}
// 자바 9 이후
AutoCloseObj obj = new AutoCloseObj();
try(obj){
thorow new Exception();
}catch(Exception e) {
System.out.println("예외 부분입니다.");
}
예외 처리 미루기
throws를 사용하여 예외처리 미루기
메서드 선언부에 throws를 추가
예외가 발생한 메서드에서 예외 처리를 하지 않고 이 메서드를 호출한 곳에서 예외 처리를 한다는 의미
main()에서 throws를 사용하면 가상 머신에서 처리됨
다중 예외 처리 시 주의 사항
예외가 다양한 경우 가장 최상위 클래스인 Exception 클래스에서 예외를 처리할 수 있음
public static void main(String[] args) {
ThrowsException test = new ThrowsException();
try{
test.loadClass("a.txt", "java.lang.String");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
} // Exception 클래스로 그 외 예외 상황 처리
}
단 Exception 클래스는 모든 예외 클래스의 최상위 클래스이므로 가장 마지막 블록에 위치해야 함
사용자 정의 예외
JDK에서 제공되는 예외 클래스 외에 사용자가 필요에 의해 예외 클래스를 정의하여 사용
기존 JDK 예외 클래스 중 가장 유사한 클래스에서 상속
기본적으로 Exception에서 상속해도 됨
public class IDFormatException extends Exception {
public IDFormatException(String message) { // 생성자의 매개변수로 예외 상황 메시지를 받음
super(message);
}
}
사용자 정의 예외 클래스 예제
public class IDFormatTest {
private String userID;
public String getUserID() {
return userID;
}
// 아이디에 대한 제약 조건 구현
public void setUserID(String userID) throws IDFormatException { // IDFormatException 예외를 setUserID() 메서드가 호출될 때 처리하도록 미룸
if(userID == null) {
throw new IDFormatException("아이디는 null일 수 없습니다."); // 강제로 예외를 발생시킴
}
else if(userID.length() < 8 || userID.length() > 20) {
throw new IDFormatException("아이디는 8자 이상 20자 이하로 쓰세요."); // 강제로 예외를 발생시킴
}
this.userID = userID;
}
'IT' 카테고리의 다른 글
HTML 소개 (0) | 2022.06.16 |
---|---|
[Do it! 자바 프로그래밍 입문] 15 자바 입출력 (0) | 2022.06.13 |
[Do it! 자바 프로그래밍 입문] 13 내부 클래스, 람다식, 스트림 (0) | 2022.06.10 |
[Do it! 자바 프로그래밍 입문] 12 컬렉션 프레임워크 (0) | 2022.06.08 |
[Do it! 자바 프로그래밍 입문] 11 기본클래스 (0) | 2022.06.05 |