[JAVA] 예외
자바의 예외에 관한 스터디 메모
[JAVA] 예외
✏️ 예외란?
예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류이다.
- Error(오류)는 개발자가 방지할 수 없다.
- Execption(예외)은 개발자가 방지할 수 있다.
- 자바에서 예외는 클래스로 관리된다.
- 모든 예외 클래스는 java.lang.Exception 클래스를 상속받는다.
예외는 일반 예외(Checked Exception)과 실행 예외(Uncheked Exception)로 구분된다.

✏️ 일반 예외
일반 예외(Checked Exception)는 컴파일러가 컴파일 하는 과정에서 확인하는 예외이다.
- 반드시 에러 처리를 해야 한다. (try/catch)
✏️ 실행 예외
실행 예외(Unchecked Exception)은 컴파일러가 체크하지 않는 예외이다.
- 실행 예외는 RuntimeException을 상속한다.
- 에러 처리를 강제하지 않는다.
| 종류 | 발생 조건 |
|---|---|
| NullPointerException | null 값을 갖는 참조 변수에 도트 연산자 사용 |
| ArrayIndexOutOfBoundsException | 배열에서 인덱스 범위를 초과해서 사용 |
| NumberFormatException | 숫자로 변환될 수 없는 문자에 parseInt() 또는parseDouble() 사용 |
| ClassCastException | 변환이 불가능한 타입으로 변환 시도 |
✏️ 예외 처리
try-catch-finally 블록을 사용하여 예외를 처리할 수 있다.
- 일반 예외는 반드시 try-catch-finally 블록을 작성해야 한다.
- 실행 예외는 개발자가 필요하다고 생각될 때만 try-catch-finally 블록을 작성하면 된다.
| 블록 | 기능 |
|---|---|
| try | 예외 발생 가능 코드를 위치시킴. 예외 발생 시 catch 블록으로 이동 |
| catch | 예외 처리 코드 실행 |
| finally | 생략 가능. 예외 발생 여부와 상관없이 항상 실행됨. try나 catch에서 return을 사용하더라도 실행됨 |
1
2
3
4
5
6
7
try{
Class clazz = Class.forName("java.lang.String2");
} catch(ClassNotFoundException e){
System.out.println("클래스가 존재하지 않음");
}
// java.lang.String2 클래스는 존재하지 않기 때문에 catch문이 실행됨
다중 catch
발생되는 예외가 많은 경우, 다중 catch를 사용하여 예외별로 처리 코드를 다르게 할 수 있다.
1
2
3
4
5
6
7
8
try {
//ArrayIndexOutOfBoundsException 예외 발생 코드
//NumberFormatExcetion 예외 발생 코드
} catch (ArrayIndexOutOfBoundsException e) {
// 예외 처리
} catch (NumberFormatExcetion e) {
// 예외 처리
}
- catch 블록이 여러개라도, 단 하나의 catch 블록만 실행된다.
- 위의 예시에서는 ArrayIndexOutOfBoundsException이 발생하면 즉시 실행을 멈추고 해당 catch 블록으로 이동한다.
catch 순서
예외를 처리해줄 catch 블록을 위에서부터 차례대로 검색된다.
1
2
3
4
5
6
7
8
try {
//ArrayIndexOutOfBoundsException 예외 발생 코드
//NumberFormatExcetion 예외 발생 코드
} catch (Exception e) {
// 예외 처리
} catch (ArrayIndexOutOfBoundsException e) {
// 예외 처리
}
어떤 예외가 발생하던 첫 번째 catch 블록만 선택되어 실행된다.
1
2
3
4
5
6
7
8
try {
//ArrayIndexOutOfBoundsException 예외 발생 코드
//NumberFormatExcetion 예외 발생 코드
} catch (ArrayIndexOutOfBoundsException e) {
// 예외 처리
} catch (Exception e) {
// 예외 처리
}
위와 같이 코드를 수정하면, ArrayIndexOutOfBoundsException 예외는 첫 번째 블록에 잡히고 나머지 예외는 두 번째 블록에 잡힌다.
✏️ throws
throws 키워드를 사용하면, 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘길 수 있다.
- throws 키워드가 붙어 있는 메소드는 반드시 try 블록 내에서 호출되어야 한다. ```java try { exceptionMethod(); } catch (ClassNotFoundException e) // 예외 처리 }
public void exceptionMethod() throws ClassNotFoundException{ // throws 떠넘길 예외클래스 // ClassNotFoundException이 발생하면 메소드를 호출한 곳에 떠넘김 Class clazz = Class.forName(“java.lang.String2”); }
1
2
3
4
5
6
7
8
<br>
main 메소드에서도 throws 키워드를 사용하여 예외를 떠넘길 수 있다.
이 경우, JVM이 콘솔에 출력하는 것으로 예외처리를 한다.
```java
public static void main(String[] args) throws ClassNotFoundException{
// 예외가 발생할 코드
}
REFERENCE
혼자 공부하는 자바
This post is licensed under
CC BY 4.0
by the author.