[JAVA] 예외

JUJU·2024년 1월 21일

✏️ 예외란?

예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류이다.

  • Error(오류)는 개발자가 방지할 수 없다.
  • Execption(예외)은 개발자가 방지할 수 있다.
  • 자바에서 예외는 클래스로 관리된다.
  • 모든 예외 클래스는 java.lang.Exception 클래스를 상속받는다.

예외는 일반 예외(Checked Exception)과 실행 예외(Uncheked Exception)로 구분된다.



✏️ 일반 예외

일반 예외(Checked Exception)는 컴파일러가 컴파일 하는 과정에서 확인하는 예외이다.

  • 반드시 에러 처리를 해야 한다. (try/catch)


✏️ 실행 예외

실행 예외(Unchecked Exception)은 컴파일러가 체크하지 않는 예외이다.

  • 실행 예외는 RuntimeException을 상속한다.
  • 에러 처리를 강제하지 않는다.
종류발생 조건
NullPointerExceptionnull 값을 갖는 참조 변수에 도트 연산자 사용
ArrayIndexOutOfBoundsException배열에서 인덱스 범위를 초과해서 사용
NumberFormatException숫자로 변환될 수 없는 문자에 parseInt() 또는parseDouble() 사용
ClassCastException변환이 불가능한 타입으로 변환 시도


✏️ 예외 처리

try-catch-finally 블록을 사용하여 예외를 처리할 수 있다.

  • 일반 예외는 반드시 try-catch-finally 블록을 작성해야 한다.
  • 실행 예외는 개발자가 필요하다고 생각될 때만 try-catch-finally 블록을 작성하면 된다.
블록기능
try예외 발생 가능 코드를 위치시킴. 예외 발생 시 catch 블록으로 이동
catch예외 처리 코드 실행
finally생략 가능. 예외 발생 여부와 상관없이 항상 실행됨. try나 catch에서 return을 사용하더라도 실행됨
try{
	Class clazz = Class.forName("java.lang.String2");
} catch(ClassNotFoundException e){
	System.out.println("클래스가 존재하지 않음");
}

// java.lang.String2 클래스는 존재하지 않기 때문에 catch문이 실행됨


다중 catch

발생되는 예외가 많은 경우, 다중 catch를 사용하여 예외별로 처리 코드를 다르게 할 수 있다.

try {
	//ArrayIndexOutOfBoundsException 예외 발생 코드
    //NumberFormatExcetion 예외 발생 코드
} catch (ArrayIndexOutOfBoundsException e) {
	// 예외 처리
} catch (NumberFormatExcetion e) {
	// 예외 처리
}
  • catch 블록이 여러개라도, 단 하나의 catch 블록만 실행된다.
  • 위의 예시에서는 ArrayIndexOutOfBoundsException이 발생하면 즉시 실행을 멈추고 해당 catch 블록으로 이동한다.


catch 순서

예외를 처리해줄 catch 블록을 위에서부터 차례대로 검색된다.

try {
	//ArrayIndexOutOfBoundsException 예외 발생 코드
    //NumberFormatExcetion 예외 발생 코드
} catch (Exception e) {
	// 예외 처리
} catch (ArrayIndexOutOfBoundsException e) {
	// 예외 처리
}

어떤 예외가 발생하던 첫 번째 catch 블록만 선택되어 실행된다.

try {
	//ArrayIndexOutOfBoundsException 예외 발생 코드
    //NumberFormatExcetion 예외 발생 코드
} catch (ArrayIndexOutOfBoundsException e) {
	// 예외 처리
} catch (Exception e) {
	// 예외 처리
}

위와 같이 코드를 수정하면, ArrayIndexOutOfBoundsException 예외는 첫 번째 블록에 잡히고 나머지 예외는 두 번째 블록에 잡힌다.



✏️ throws

throws 키워드를 사용하면, 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘길 수 있다.

  • throws 키워드가 붙어 있는 메소드는 반드시 try 블록 내에서 호출되어야 한다.
try {
	exceptionMethod();
} catch (ClassNotFoundException e)
	// 예외 처리
} 

public void exceptionMethod() throws ClassNotFoundException{
	// throws 떠넘길 예외클래스
    // ClassNotFoundException이 발생하면 메소드를 호출한 곳에 떠넘김
	Class clazz = Class.forName("java.lang.String2");
}

main 메소드에서도 throws 키워드를 사용하여 예외를 떠넘길 수 있다.
이 경우, JVM이 콘솔에 출력하는 것으로 예외처리를 한다.

public static void main(String[] args) throws ClassNotFoundException{
	// 예외가 발생할 코드
}


## REFERENCE 혼자 공부하는 자바
profile
백엔드 개발자

0개의 댓글