예외(Exception)의 종류
코드 작성시 다양한 오류를 마주할 수 있다. (반면 에러는 스택오버플로우 등 개발자가 다루기 어려운 심각한 문제를 말한다.)
- 컴파일 오류: 컴파일할 때 발생하는 오류로, 오탈자나 잘못된 자료형 등 문법적 문제에서 발생한다. (Syntax Error)
IDE에서 빨간색 밑줄로 표시되므로 비교적 쉽게 발견하고 해결할 수 있다. - 런타임 오류: 코드를 실행하는 과정에서 발생하는 오류로, 컴퓨터에게 수행할 수 없는 작업을 요청할 때 발생한다.
JVM이 프로그램을 실행하는 도중 위와 같은 오류가 발생하면 해외 예외 클래스를 객체로 생성한다.
자바의 모든 에러와 예외는 Throwable 클래스로부터 확장되며, 모든 예외의 최고 상위클래스는 Exception 이다.
(try - catch 문에서 어떤 예외가 발생할지 모를 경우 Exception e 를 사용하는 이유임)
Exception 클래스는 Throwable 클래스가 제공하는 toString(), printStackTrace() 메소드를 상속받으므로 이를 사용하여 예외 종류와 예외 발생 위치를 출력할 수 있다.
예외 처리
예외 처리란, 에러에 대비하는 코드를 사전에 작성하여 비정상적인 종료를 방지하고, 정상적인 실행을 유지하는 것을 말한다.
(예외 처리를 통해 예외 로그를 남겨서 실제로 어떤 문제가 발생한 것인지 확인할 수 있음)
1. try-catch 문을 사용한 예외 처리
try {
// 예외가 발생할 수 있는 코드
} catch(발생하는 예외 선언) {
// 예외 발생시 수행할 내용
}
try-catch 문과 함께 finally 블록을 사용할 수 있는데, 이는 예외 발생과 무관하게 try가 실행될 경우 반드시 실행되는 부분이다.
finally 블록은 의무사항이 아니며 생략 가능하다.
[활용 예시]
public class ExceptionTest{
public static void main(String[] args){
int[] arr = {1, 2, 3, 4, 5}; // 요소 5개인 배열 선언 및 초기화
try{
for(int i=0; i<=5; i++){ // 배열을 인덱스 0번부터 5번까지 순회하면서 반복하도록 설정
System.out.print(arr[i]); // 인덱스는 4번까지 있으므로 i가 5일때 오류 발생 -> catch문으로 이동
}
}catch(ArrayIndexOutOfBoundsException e){ // 해당 예외 발생하면 실행될 내용
System.out.println();
System.out.println(e); // 예외 내용 (오류의 종류, 오류 위치) 출력
}finally{ // try문이 실행되면 오류 유무에 관계없이 무조건 실행될 내용
System.out.println("finally");
}
System.out.println("출력 종료"); // 예외 발생했으나 중간에 코드 종료되지 않고 끝까지 실행됨
}
}
//출력값
12345
java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
finally
출력 종료
2. 예외 전가
예외를 발생시킨 곳으로 예외를 떠넘기는 방법. [ throws + 예외명 ]을 통해 예외를 전가한다.
메서드 자체에서 예외에 대한 처리를 바로 하는것이 아니라, 해당 메서드를 사용하는곳에서 예외를 처리하도록 하는 방법이다.
void ExampleMethod() throws Exception { // throws 를 통해 예외를 전가하고 있다.
}
( 비교) throw
throw 는 예외를 의도적으로 발생시키는 것을 말한다.
[ throw + 예외명 ]을 통해 예외를 발생시킬 수 있다. (자세한 사례는 아래 사용자 정의 예외 참고)
사용자 정의 예외
코드 작성중 필요한 예외 상황이 있을 경우 해당 예외를 만들어서 사용할 수 있다.
ex. 비밀번호 - 반드시 어떠한 형태를 가지는 문자열이어야함(숫자 8자리, 대문자 포함 등)
예외의 상위클래스인 Exception을 상속받은 클래스를 만들어 사용할 수 있다.
메서드에서 throw를 통해 조건에 맞지 않으면 해당 예외클래스를 생성하여 오류 상황을 만들 수 있다.
[활용 예시]
public class PWFormatException extends Exception{ // Exception을 상속받은 사용자 정의 예외 클래스 정의
public PWFormatException(String message){ // 사용자 정의 예외의 생성자
super(message); // 상위클래스인 Exception 의 생성자 호출
}
}
// PWFormatTest 클래스의 메서드
public void setUserPW(String userPW) throws PWFormatException{ // throws사용해서 예외 발생시 이 메서드 호출한 곳에서 처리하도록 예외 전가
if(userPW == null){
throw new PWFormatException("패스워드는 null일 수 없습니다."); // 패스워드가 null이면 예외 발생
}
this.userPW = userPW;
}
// 실제 코드 구현부
public static void main(String[] args) {
PWFormatTest pwTest = new PWFormatTest(); // PWFormatTest 객체 생성
String userPW = null;
try{
pwTest.setUserPW(userPW); // userPW가 null 이므로 PWFormatException 발생 -> catch 문으로 이동
} catch (PWFormatException e){
System.out.println(e); // 오류 내용 표시
}
}
// 출력내용
exception.PWFormatException: 패스워드는 null일 수 없습니다.
'추가 공부 > Java' 카테고리의 다른 글
[Java] Main 클래스와 main 메서드 (0) | 2023.03.02 |
---|