Post

[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.