본문 바로가기

개발(합니다)/Java&Spring

[java-기초-10] 예외 처리

반응형

예외와 예외 클래스

  • 자바에는 에러 이외에 예외라고 부르는 오류가 있고 예외가 발생되면 프로그램은 곧바로 종료할 수도 있고 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있다.
  • 예외는 일반 예외(Exception)와 실행 예외(Runtime Exception)가 있다
    • 일반 예외는 컴파일 예외라고도 하며 컴파일 과정에서 예외 처리 코드가 필요한지 검사한다.
    • 실행 예외는 컴파일하는 과정에서 예외 처리 코드를 검사하지 않는 예외를 말한다.

실행 예외

  • 자바 컴파일러가 체크하지 않기 때문에 오로지 개발자의 경험에 의해서 예외 처리 코드를 삽입해야 한다.
  1. NullPointerException
    • null 값을 갖는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생하는데 객체가 없는 상태에서 객체를 사용하려고 해서 예외가 발생한다.
  2. ArrayIndexOutOfBoundsException
    • 배열에서 인덱스 범위를 초과하여 사용할 경우 실행 예외가 발생한다.
  3. NumberFormatException
    • 문자열로 되어 있는 데이터를 숫자로 변경할 때 숫자로 반환될 수 없는 문자가 포함되면 실행 예외가 발생한다.
  4. ClassCastException
    • 상위 클래스와 하위 클래스 간에 타입 변환이 일어날 때 억지로 타입 변환을 시도한 경우에 실행 예외가 발생한다.

예외 처리 코드

  • 프로그램에서 예외가 발생했을 경우 프로그램의 갑작스러운 종료를 막고, 정상 실행을 유지할 수 있도록 처리하는 코드를 예외 처리 코드라고 한다.
try {
    예외 발생 가능 코드 
} catch(예외클래스 e) {
    예외 처리;
} catch(예외클래스 e) { // 다중 catch문 가능
    예외 처리; 
} catch(예외클래스 | 예외클래스 e) { // 멀티 catch문 가능
    예외 처리; 
} finally {
    항상 실행; // 반드시 실행해야 하는 구문 =>  파일 닫기 
}

정상일 경우와 예외 발생일 경우

예외 떠넘기기

  • 메서드 내부에서 예외가 발생할 수 있는 코드를 작성할 때 try-catch 블록으로 예외를 처리하는 것이 기본이지만, 경우에 따라서는 메서드를 호출한 곳으로 예외를 떠넘길 수도 있다.
  • throws 키워드를 사용하며 메서드 뒤에는 넘길 에외 클래스를 쉼표로 구분해서 나열해주면 된다.
  • 리턴타입 메서드명(매개변수, ...) throws 예외클래스1, 예외클래스2, ... {}
public void method1() {
    try {
        method2(); // 호출 위치
    } catch(ClassNotFoundExcpetion e) { 
        System.out.println("클래스가 존재하지 않습니다.");
    }
}

public void method2() throws ClassNotFoundException { // 호출한 곳에서 예외처리 하도록 함
    Class claszz = Class.forName("java.lang.Strin2");
}

사용자 정의 예외와 예외 발생

  • 일반 예외로 선언할 경우 Exception을 상속하면 되고, 실행 예외로 선언할 경우에는 RuntimeException을 상속하면 된다.
    public class XXXException extends [ Exception | RuntimeException] { // 사용자 정의 예외
        public XXXException() {}
        public XXXException(String message) { super(message); }
    }

    public void method() throws XXXException {
        throw new XXXException("메세지");
    }

예외 정보 얻기

  • e.getMessage()와 e.printStackTrace()를 사용할 수 있다.
반응형