[Java] 기초7 (오류, 예외)

sua_ahn·2022년 12월 28일
0

Java

목록 보기
8/15
post-thumbnail

프로그램 오류 Error

: (넓은 의미) 어떠한 원인에 의한 프로그램 오작동
  (좁은 의미) 프로그래머가 복원할 수 없는 형태의 심각한 오류

예외 Exception

: 프로그래머가 복원할 수 있는 오류 상황

발생시점에 따른 오류

  1. Compile error
    소스코드를 컴파일러가 컴파일하는 시점에서 소스의 오타나 잘못된 구문, 자료형 체크 등 검사를 수행하는데 여기서 발생하는 에러

    Tip. 컴파일 에러는 소스 코드를 javac.exe로 컴파일 하는 과정에서 컴파일러가 전반적인 코드를 체크해서 에러 메세지를 보여주는 형태이지만, IDE에서 일정 주기로 자동 컴파일을 해주기 때문에 바로바로 문제를 알 수 있는 것이다.

  2. Runtime error
    컴파일은 문제없이 완료되어 프로그램이 실행되는 도중에 의도치않은 동작에 대처하지 못해 발생하는 에러

  3. Logical error
    개발자의 의도와는 다르게 동작하는 에러(버그)

 


Java에서 에러, 예외 클래스의 계층 구조

Java에서는 예외와 에러도 객체로 처리한다.

  • Throwable 클래스
    오류나 예외에 대한 메시지를 담음

    주요 메소드

    • getMessage() : 예외의 원인을 문자열로 반환
    • printStackTrace() : 예외가 발생한 위치와 호출된 메소드의 정보 출력
  • Error 클래스
    메모리 부족(OutOfMemoryError)이나 스택오버플로우(StackOverflowError)와 같이 일단 발생하면 복구할 수 없는 심각한 오류를 담음
    즉, 에러는 JVM 실행에 문제가 생긴 것이므로 개발자가 대처할 방법이 없음

  • Exception 클래스
    발생하더라도 수습될 수 있는 비교적 덜 심각한 오류를 담음

    • Checked Exception (필수 예외)
      치명적인 예외 상황을 발생시키므로, 자바 컴파일러가 예외를 처리하도록 강제함
    • Unchecked Excepion (선택적 예외)
      RuntimeException 하위에 있는 예외로, 예외처리를 강제하지 않음

 


🎯 예외처리 방법 Exception handling

1. try-catch

try{
      exception 발생가능성이 있는 코드
} catch(예외클래스1 e) {
      메시지 출력
} finally {
      무조건 실행
      복구코드 - undo/rollback
}

2. throws
메서드 내에서 예외처리를 하지 않고 해당 메서드를 사용한 곳에서 예외 처리를 하도록 예외를 위로 던지는 것입니다. 예외를 전가하는 것

(throw의 경우 개발자가 의도적으로 예외를 발생시키는 것. 예외가 발생할 수 있는 코드가 있다는 것을 인지시키고 예외처리를 강요)

static void func() throws 예외클래스 {
  예외가 발생할 수 있는 함수
}


🎪 자주 보이는 Exception

checked exception

  1. 입출력 오류
    IOException (⊃ FileNotFoundException)

  2. 클래스를 찾지 못한 경우
    ClassNotFoundException

unchecked exception

  1. 인덱스 범위 초과
    ArrayIndexOfBoundsException / StringIndexOfBoundsException
  • try-catch
    int array[] = {1, 2, 3};

    try {
        for (int i = 0; i < 5; i++) {
            System.out.println(array[i]);
        }
    } catch (ArrayIndexOutOfBoundsException e) {
    //	System.out.println("배열범위 초과!");
    //	e.printStackTrace();
        System.out.println(e.getMessage());
    } finally {
        System.out.println("finally");
    }

    System.out.println("end");
  • throws
    static void func() throws IndexOutOfBoundsException {
        int num[] = {1, 2, 3};

        for (int i = 0; i < 4; i++) {
            System.out.println(num[i]);
        }
    }
  1. 산술연산을 수행할 수 없는 경우(정수를 0으로 나누는 등)
    ArithmeticException

  2. 빈 객체를 참조하는 경우
    NullPointerException

profile
해보자구

0개의 댓글