Exception Handling 이란?
예외처리입니다. 예외 발생 시 적절한 대처 방안을 실행하고 프로그램이 정상 수행되게 하는 것을 말합니다. JVM이 프로그램 실행 중 Exception이 발생되면 즉시 프로그램 실행을 중단합니다. 프로그램 중단을 막기 위해 예외 처리를 해야합니다. 서버가 종료되면.... 안되잖아요.
실생활 예로 들면,
- 머리가 아프면 하던 일을 멈추고 두통약을 받아 복용합니다.
- 실명 인증서버에 장애 발생되면 메세지 창을 보여줘 잠시 후에 접속하도록 유도합니다.
Try란?
예외 발생 예상 지점을 try를 이용해 감싸주어 예외가 발생하면 처리할 수 있게 합니다.
Catch 란?
예외 처리 및 예외 발생 시 대처방안을 작성하는 곳입니다.
두개를 같이 사용해야 코드가 완성이 되기 때문에 개념만 짧게 사용했습니다. 예제를 한번 보시죠.
Try, Catch 예시
public class TestException4 {
/*
JVM 은 예외 발생 즉시 실행 중단
Exception Handling 즉 try, catch 처리하면 예외 발생시
대안을 실행하고 프로그램 정상 수행
*/
public static void main(String[] args) {
String s="스물";
try {
int age=Integer.parseInt(s);
System.out.println(age+2);
}catch(NumberFormatException ne) {
System.out.println("나이를 정수로 입력하세요");
}
System.out.println("프로그램 정상 수행");
}
}
try 구문에 age 변수가 s 변수를 받아서 숫자로 변형해야 하는 상황인데, s의 값이 숫자가 아니라 진짜 문자열이기 때문에 변환 할 수 없어 NumberFormatException이라는 에러가 나옵니다. 하지만 catch 구문에 그러한 예외를 잡아서 프로그램의 종료를 막아주고 "나이를 정수로 입력하세요" 라는 문구가 나오게 만들어 줍니다.
만일, try catch 구문이 없었으면 에러가 나오면서 당장 프로그램이 멈췄을 텐데, 멈추지 않는 것이죠.
이것이 바로 예외 처리 입니다.
다음으로 throws와 throw에 대하여 알아봅시다.
Throws 란?
예외를 던질 수 있다고 미리 명시해주는? 명령어입니다. 메소드와 생성자 선언부에서 명시됩니다.
Throw란?
예외를 고의로 발생하겠다는 의미를 가지고 있습니다. 업무 로직에 의해 필요 시 예외를 발생기켜 호출한 측으로 전파합니다.
예시로는
- 통장 잔고가 부족할 때 잔액 부족 예외를 발생시켜 사용자 측으로 전파합니다.
Throws와 Throw의 예
청소년 관람 불가 영화에 대한 예시를 보겠습니다.
public class TestThrow1 {
public static void main(String[] args) {
MovieService service=new MovieService();
int age=12;
age=12;
String result;
try {
result = service.enterAdultMovie(age);
//아래는 정상 흐름일때 후속작업
System.out.println(result);
} catch (AgeException e) {
//e.printStackTrace();//전체 예외 경로와 메세지
System.out.println(e.getMessage());//실제 예외 메세지만
}
}
}
public class MovieService {
/*
throws : 예외를 던진다 , 호출한 측으로
throw : 필요시 예외를 발생시킨다
*/
public String enterAdultMovie(int age) throws AgeException {
if(age<19)
throw new AgeException(age+"세이므로 미성년 관람불가 입니다");
return "고객님 즐거운 관람되세요 영화서비스";
}
}
public class AgeException extends Exception{
private static final long serialVersionUID = 7341176327490701018L;
public AgeException(String message) {
super(message);
}
}
이렇게 따로 청소년 관람 불가 예외처리를 직접 작성하여 나이가 맞지 않을 때 AgeException에러를 발생시키는 코드를 만들었습니다.
- AgeException class를 확인해보면 Exception 을 상속받아 생성자에 Exception에 있는 메소드를 오버라이딩 받아 사용하고 있습니다.
- Movie Service에 있는 enterAdultMovie 메소드에 throws 를 작성하여 나이가 맞지 않으면 AgeException에러를 발생시킬 수 있다고 명시해줍니다. 그래서 함수 내에도 확인해보면 나이가 19살 미만이라면 AgeException을 throw 할 것이라고 작성했습니다.
- main메소드를 가서 확인해보면 위에서 설명한 try catch 문이 사용되었는데, try속에 result 변수를 할당하는 메소드에서 AgeException 에러가 나올테니 catch 구문에서 "12세이므로 미성년 관람불가 입니다"라는 메세지가 나오고 프로그램을 계속 실행 될 것입니다.
직접 예시를 IDE에 작성하면서 확인해보는 것이 가장 이해하기 좋을 것입니다. 블로그로 보는 것은 위로 내렸다 올렸다 해야해서 이해가 빠르게 되지는 않더라고요.
Exception 계열에는 UnChecked Exception 계열과 Checked Exception 계열이 있습니다.
UnChecked Exception 계열 이란?
RuntimeException 계열의 Exception -> RuntimeException 계층구조 하에 있는 Exception은 별도의 throws 없이 자동으로 호출한 측으로 전파됩니다.
대표적 런타임예외 : NullPointerException, NumberFormatException, IndexOutOfBoundsException 등
Checked Exception 계열 이란?
RuntimeException 계열이 아닌 모든 Exception 컴파일 시점에 예외 처리할 것을 알려준다 ( try catch 또는 throws 선택지가 있다 )
소감
예전에 테스트 주도 개발에 대하여 공부할 때 try catch를 사용해서 예외처리를 했는데, throw 나 throws에 관련해서는 배워보지 못했습니다. 예외를 직접 만들어서 사용하는 것은 처음해봤는데, 어떠한 프로그램의 주인이 된다면 자신의 프로그램에 맞는 예외처리를 할 수 있다는 메리트를 가질 수 있어 좋다고 생각했습니다.
또한, 프로그램을 만들 때 항상 예외에 대한 생각을 해야겠다고 생각했습니다.
'코딩 개발 > Java' 카테고리의 다른 글
Java - ObjectInputStream & ObjectOutputStream (2) | 2023.04.20 |
---|---|
Java - File Class에 대한 간단한 예제 (0) | 2023.04.18 |
Java - Map (0) | 2023.04.12 |
Java - Set, ArrayList (0) | 2023.04.11 |
Java - Interface (feat. abstract) (0) | 2023.04.11 |