[Java /자바] 예외 처리(Exception Handling)
예외의 발생은 여러가지 방면에서 발생할 수 있다.
가령 사용자의 실수나, 네트워크의 불안정성, 디스크의 메모리부족, 개발자의 코드 에러 등 다양한 부분에서 예외가 발생한다.
그렇다면 이러한 예외는 어떻게 해결할 수 있을까?
java에서는 예외가 발생하게 되면 컴파일러가 컴파일을 멈추고 에러가 발생된다.
이러한 에러는 컴파일 에러와 런타임에러가 있다.
컴파일 에러
이름 그대로 컴파일을 할 때 발생하는 에러다.
새미콜론의 생략, 오탈자, 잘못된 포맷 및 자료형 등 문법적 오류를 뜻하게 된다.
컴파일 오류는 IDE가 특정 라인에서 발생하는 오류를 빨간색으로 표시해주기 때문에 보다 쉽게 파악 할 수 있다.
런타임 에러
런타임은 런타임시에 발생하는 에러를 뜻한다.
또한 런타임에러는 JVM(Java Virtual Machine)에서 감지한다.
주로 개발자가 컴퓨터가 수행 할 수 없는 작업을 요청 할 때 발생한다.
에러와 예외
일반적으로 프로그램과 관련된 문제는 에러라고 부르지만
전문적으로 프로그램 관련 문제는 에러(Error)와 예외(Exception)로 구분된다.
- 에러(Error) : 발생하면 복구하기 어려운 수준의 오류
- 예외(Exception) : 잘못된 코딩 및 사용에 대한 오류, 코드 수정을 통해 수습이 가능한 오류를 뜻한다.
예외는 예외클래스로부터 객체를 생성하여 해당 인스턴스로 하여금 예외처리를 하게 된다.
위에 보이는 계층도는 그 구조를 설명해주고 있다.
예외는 Throwable클래스로부터 확장되어 Error, Exception클래스 다시 Runtime Exception, Other Exception으로 상,하위 클래스 구조를 가지고 있다.
일반 예외 클래스
주로 잘못된 클래스 명이나 잘못된 데이터 형식으로 발생하는 예외다.
- 잘못된 클래스명의 예외 (ClassNotFoundException)
- 잘못된 데이터 형식의 예외 (DataFormatException)
실행 예외 클래스
자바 문법과 관련된 예외다.
- 클래스간 형변환 오류 (ClassCastException)
- 벗어난 배열 범위 지정 (ArrayIndexOutOfBoundsException)
- 값이 null인 참조변수 사용 (NullPointerException)
등등의 오류가 있다.
예외의 처리 ( try -catch문)
예외의 처리는 잠재적으로 발생 할 수 있는 예외에 따라 비정상적인 종료나 오류를 대비하여 정상실행 할 수 있도록 처리하는 코드를 뜻한다.
이러한 방법으로 try -catch문을 사용한다.
우선 try문에는 예외가 발생할 가능성이 있는 코드를 삽입한다.
그리고 catch문에는 예외가 발생했을 때 실행되는 코드를 삽입한다.
즉, 다음과 같이 진행된다.
try{
//예외 발생 가능성이 있는 코드
throw new Exception(); //강제 에러 출력
}catch (Exception e){
//예외 발생시 출력되는 코드
System.out.println("예외 발생");
}finally{
}
이때 fanally문은 꼭 포함되지 않아도 된다.
예외 전가(throws)
throws를 활용해 예외를 전가하는 방법도 있다.
예외를 호출한 곳에 예외를 떠넘기는 방식이다.
다음과 같이 던져줄 수 있다.
class Main {
public static void main(String[] args) {
try {
throwException();
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
}
}
static void throwException () throws ClassNotFoundException, NullPointerException {
Class.forName("java.lang.StringX");
}
}
다음 코드의 예외처리는 throwException이 아닌 main메서드가 하게된다.
예외 발생
다음과 같이 의도적으로 예외를 발생시킬 수도 있다.
class Main {
public static void main(String[] args) {
try {
Exception test = new Exception("의도적 예외");
throw test; // 예외 선언
} catch (Exception e) {
System.out.println("의도적 예외가 발생했다!");
}
}
}