자바 예외(Exception) 및 예외 처리(try-catch)
예외(Exception) 란?
예외는 프로그램 실행 중 예상하지 못한 상황이 발생하는 것을 의미 (ex. 0으로 나누기)
이 때, throw new 키워드를 통해 예외를 발생시키고, 예외 처리(try-catch)를 통해 제어할 수 있다.
throw new 는 '의도적인 예외'라고 생각하면 된다. (ex. age < 19 를 막고싶을 때)
그리고 예외 구조에는 체크 예외와 언체크 예외가 존재한다.
언체크 예외는 컴파일러가 예외 처리를 강제하지 않는 예외이다.
끝내 예외가 처리되지 않으면 프로그램이 비정상적으로 종료된다.
RuntimeException 클래스를 상속받는 모든 예외를 UncheckedException이라고 한다. 또한,
Exception 클래스를 '직접' 상속받는 모든 예외를 CheckedException이라고 한다.
RuntimeException - UncheckedException 예시
public class ExceptionPractice {
public void UncheckedException() {
if (true) {
System.out.println("언체크 예외 발생");
throw new RuntimeException(); // 예외발생
}
}
}
public class Main {
public static void main(String[] args) {
ExceptionPractice exceptionPractice = new ExceptionPractice();
// 상위로 전파된 예외처리
try {
exceptionPractice.UncheckedException();
} catch (RuntimeException e) { // 예외처리
System.out.println("언체크 예외 처리");
} catch (Exception e) {
System.out.println("체크 예외 처리");
}
System.out.println("프로그램 종료");
}
}
Exception - CheckedException 예시
public class ExceptionPractice {
public void CheckedException() {
// try-catch 로 예외 처리
try {
if (true) {
System.out.println("체크예외 발생");
throw new Exception();
}
} catch (Exception e) {
System.out.println("예외 처리");
}
}
}
public class Main {
public static void main(String[] args) {
// 예외 실습 객체 인스턴스화
ExceptionPractice exceptionPractice = new ExceptionPractice();
// 체크예외 호출
exceptionPractice.CheckedException();
}
}
throw 활용 예시
public class ExceptionPractice {
public void CheckedException() throws Exception { // throws 예외를 상위로 전파
if (true) {
System.out.println("체크예외 발생");
throw new Exception();
}
}
}
public class Main {
public static void main(String[] args) {
// 예외 실습 객체 인스턴스화
ExceptionPractice exceptionPractice = new ExceptionPractice();
// 체크 예외 사용
// 반드시 상위 메서드에서 try-catch 를 활용해 주어야한다.
try {
exceptionPractice.CheckedException();
} catch (Exception e) {
System.out.println("예외처리");
}
}
궁금증
언체크 예외를 사용하면, 개발 생산성을 증가시키고 불필요한 코드를 줄일 수 있다고 들었다.
하지만, 여기서 나는 궁금증이 생기는게
'단순한 예외더라도 그걸 처리를 해주기 위해서 예외 처리 메서드를 만들어주는 건데, 단순한 예외라고 해서 검토만으로 해결이 된다는 것은 굳이 언체크 예외 처리까지 만들어 줄 필요는 없지 않나?
그리고 만든다고 하더라도 만약 0으로 나누는 단순한 예외는 그럼 어떻게 처리를 해야할까?
그냥 단순히 조건문으로 처리해준다고 생각하면 되나?
근데 그럼 그냥 단순히 조건문만 사용해서 예외처리를 해줄 수 있는 것이 아닌가' 라는 궁금증이 생겼다.
이는 아직 해결을 못해서 자세히 알아본 다음에 글을 수정해보도록 하겠다.