개발소설

[JAVA] 예외 처리(Exception Handling) 본문

자바

[JAVA] 예외 처리(Exception Handling)

ChaeHing 2023. 3. 7. 23:39

예외 처리(Exception Handling)

  • 프로그램의 비정상적인 종료를 방지, 정상적인 실행 상태를 유지하기 위해 사용

에러의 종류

  • 내부적인 요인 : 개발자의 코드 에러
  • 외부적인 요인 : 하드웨어 문제, 네트워크 문제, 사용자 조작 문제

내부적인 요인을 최소화 하기위해 예외처리를 해야한다.

 

컴파일 에러(Compile Time Error)

  • 컴파일 할때 발생 하는 에러
  • 세미콜론 생략, 오탈자등 문법적인 오류 , syntax 에러라고도 불림
  • IDE에서 빨간줄로 미리 알려주기 때문에 발견하기 가장 좋다. 
  • 자바 컴파일러에서 감지

런타임 에러(Run Time Error)

  • 런타임 시에 발생하는 에러
  • 주로 개발자가 컴퓨터가 수행 할 수 없는 특정한 작업을 요청할 때 발생
  • JVM에서 감지

에러와 예외

  • 복구하기 어려운 수준의 심각한 오류를 에러
  • 잘못된 사용 또는 코딩으로 인한 상대적으로 미약한 수준의 오류를 예외
    • 코드 수정을 통해 수습이 가능

예외 클래스의 상속 계층도

Throwable
Error Exceptions
  Other Exeptions Runtime Exceptions
  • Throwable 클래스로 부터 확장
  • 예외의 최고 상위 클래스는 Exception 클래스
  • Exception 클래스는 일반예외 클래스와 실행 예외 클래스로 나뉜다.

일반 예외 클래스(Exception)

  • 실행예외클래스(Runtime Exceptions)와 그 하위 클래스를 제외한 모든 Exception  클래스와 그 하위 클래스
  • 컴파일러가 코드 실행 전에 예외 처리 코드 여부를 검사 해서 checked 예외
  • 주로 잘못된 클래스명(ClassNotFoundException)이나 데이터 형식(DataFormatException) 등 사용자편의 실수로 발생

실행 예외 클래스(Runtime Exception)

  • 런타임시 발생하는 RuntimeException 클래스와 그 하위클래스
  • 컴파일러가 예외 처리 코드 여부를 검사 하지 않기 때문에 unchecked 예외
  • 주로 개발자의 실수에 의해 발생하는 경우가 많고, 자바 문법 요소와 관련
  • 클래스 간 형변환 오류(ClassCastException), 벗어난 배열 범위 지정(ArrayIndexOutOfBoundsException), 값이 null인 참조변수 사용(NullPointerException)

try - catch문

  • 예외 처리를 하기 위한 문법
try{
    // 예외 발생 가능성이 있는 코드 삽입
}
catch (ExceptionType1 e1){
    // ExceptionType1 유형의 예외 발생시 실행 코드
}
catch (ExceptionType2 e2){
    // ExceptionType2 유형의 예외 발생시 실행 코드
} finally {
    // 옵션 조건
    // 예외 발생 여부와 상관없이 항상 실행
}
  • 정상적으로 실행되면 catch는 실행되지 않고 finally가 실행됨
  • catch는 해당 유형의 예외가 발생하는 경우 실행
  • catch가 여러개면 일치하는 하나의 catch만 실행
  • 일치하는 예외를 못찾는 경우 예외 처리 되지 못함

예제 - 실행 순서 확인

   try{
        System.out.println("[소문자 알파벳을 대문자로 출력하는 프로그램]");
        printMyName(null); // (1) 예외 발생 NullPointerException 발생
        printMyName("abc"); // 이 코드는 실행 되지 않음
    }
    catch (ArithmeticException e){ // (2) instanceOf 연산자를 통해 예외클래스의 인스턴스와 비교
                                   // 예외처리 되지 않음
        System.out.println("ArithmeticException 발생");
    }
    catch (NullPointerException e){ // (3) 일치하기 때문에 예외처리됨 {} 안 실행
        System.out.println("NullPointerException 발생");

        // 예외 정보 얻는 방법 세개
        System.out.println("e.getMessage: " + e.getMessage());
        System.out.println("e.toString " + e.toString());
        e.printStackTrace();
    }
    finally { // (4) 예외 발생 여부와 관계 없이 무조건 실행,  option 이기 때문에 생략 가능
        System.out.println("프로그램 종료");
    }
static void printMyName(String str) {
    String upperCaseAlphabet = str.toUpperCase();
    System.out.println(upperCaseAlphabet);
}

/*
[소문자 알파벳을 대문자로 출력하는 프로그램]
NullPointerException 발생
e.getMessage: null
e.toString java.lang.NullPointerException
프로그램 종료
java.lang.NullPointerException
	at Exception.printMyName(Exception.java:107)
	at Exception.main(Exception.java:88)
*/

예외 전가

  • try-catch문 외에 예외를 떠넘기는 방법
  • throws를 통해 발생할 예외들을 호출한 곳에서 예외를 떠안게함
반환타입 메서드명(매개변수, ...) throws 예외클래스1, 예외클래스2, ... {
}

// 특정 메서드에서 모든 종류의 예외가 발생할 수 있는 경우
// Exception은 모든 예외 클래스의 상위 클래스
void ExampleMethod() throws Exception {
}

main 메서드의 예외넘기기

public class Exception {

    public static void main(String[] args) {
        try {
            throwException(); // (1) 호출
        } catch (ClassNotFoundException e) { // (3) 예외 확인
            System.out.println(e.getMessage()); // (4) 예외 처리
        }
    }

    static void throwException() throws ClassNotFoundException, NullPointerException {
        Class.forName("java.lang.StringX"); // (2) ClassNotFoundException 발생
                                            // 예외 처리를 호출하는 메소드 (main)으로 넘김 
    }
}

/*
java.lang.StringX
*/

의도적인 예외 발생

  • throw 키워드를 통해 예외 발생 가능
try {
    Exception intendedException = new Exception("의도된 예외 만들기"); 
    throw intendedException; // 예외 만들기
} catch (Exception e) {
    System.out.println("고의로 예외 발생시키기 성공!");
}

/*
고의로 예외 발생시키기 성공!
*/

 

'자바' 카테고리의 다른 글

[JAVA] 람다 (Lambda)  (0) 2023.03.08
[JAVA] 애너테이션 (Annotation)  (0) 2023.03.08
[JAVA] 컬렉션 프레임 워크 (Collection Framework)  (0) 2023.03.08
[JAVA] 제네릭 (Generic)  (0) 2023.03.07
[JAVA] 열거형(enum)  (0) 2023.03.07
Comments