프로그래밍 언어/JAVA
예외 처리
KYBee
2022. 8. 14. 20:15
에러와 예외
에러와 예외
어떤 원인에 의해 오동작 하거나 비정상적으로 종료되는 경우
- 심각도에 따라 분류
- Error
- 메모리 부족, stack overflow와 같이 일단 발생하면 복구할 수 없는 상황 : 종료를 해야만 한다.
- 프로그램의 비정상적 종료를 막을 수 없고 → 디버깅 필요
- Exception
- 읽으려는 파일이 없거나, 네트워크 연결이 안되는 등, 비교적 가벼운 상태가 약한 것들
- 프로그램 코드에 의해 수습될 수 있다.
- Error
- Exception Handling
- 이러한 Exception을 처리해서 프로그램의 비정상 종료를 막는다.
- 예외 감지 코드, 예외 발생 시 동작할 코드 필요
Exception
- Checked Exception
- 예외에 대한 처리가 없으면 컴파일 자체가 안됨
- 반드시 throws로 위임 혹은 try catch로 처리 필요
- Unchecked Exception
- 예외에 대한 대처 코드가 없어도 일단 컴파일은 진행 됨
- throws 하지 않아도 전달되지만 결국 try catch로 처리 필요
Try - Catch 로 처리함
int[] intArr = {10};
try {
System.out.println(intArr[2]);
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("에러 핸들링");
e.printStackTrace();
}
예외 발생 시
- JVM이 해당 익셉션 클래스를 생성하여 던진다.
- 던져진 Exception 을 처리할 수 있는 catch 블록에서 이를 받고 처리한다.
- 정상적으로 처리되면 try catch 다음 문장으로 넘어간다.
try {
} catch (Exception e) {
} catch (XXException e) {
}
- XXException 역시 Exception에서 처리된다. 상위 타입이 먼저 선언되었기 때문에
- 에러 처리에도 다형성 적용
Try - Catch - Finally
- 중간에 return을 만나도 → catch나 try에서도 finally 블록을 먼저 수행 후에 리턴을 실행함.
- 주로 finally 에는 자원 반납 코드를 사용함.
try {
// exception이 발생할 만한 코드
} catch {
// exception 발생 시 처리 코드
} finally {
// try block에서 접근했던 System 자원의 안전한 원상복구
}
package com.ssafy.live4.exception.install;
public class UseInstaller {
public static void main(String[] args) {
// TODO: InstallApp을 이용하면서 자원이 확실히 정리되도록 해보자.
InstallApp app = new InstallApp();
try {
app.copy();
app.install();
} catch (Exception e) {
e.printStackTrace();
} finally {
app.delete();
}
// END:
System.out.println("설치 종료");
}
}
throws를 통한 처리 위임
- method에서 처리해야 할 하나 이상의 예외를 호출한 곳으로 전달
- 예외가 없어지지 않고 단순하게 전달된다
- 예외를 전달받은 메서드는 다시 예외 처리의 책임 발생
throw는 예외를 처리
throw : 예외를 처리
throws : 예외를 위임
사용자 정의 예외
- API 에 정의되지 않은 사용자 정의 예외 클래스 작성
- Exception또는 RuntimeException 클래스를 상속받아 작성한다.
- checked exception 활용: 명시적 예외 처리 또는 throws 필요 ⇒ Exception
- runtime exception 활용 : 묵시적 예외 처리 가능 ⇒ RuntimeException
장점
- 객체의 활용 : 필요한 추가정보, 기능 활용 가능
- 코드의 재사용 : 동일한 상황에서 예외 객체 재사용 가능
- throws 메커니즘의 이용 : 중간 호출 단계에서 return 불필요
적용 순서
- 예외 클래스 만들기
- 예외 상황에서 예외 객체 생성하여 던지는 코드 작성
- 던져진 예외 상황을 처리
CheckException 예시
- SQLException
- IOException
- FileNotFoundException
RuntimeException 예시
직접 실행해봐야 알 수 있는 예외들
- ArrayIndexOutOfBoundsException
- ArithmeticException
- NullPointerException
- ClassCastException
- 적절하지 못한 형 변환을 하는 경우
- instanceof 를 사용함