[Java] Error & Exception

Juhye Pyoun·2023년 9월 8일

Java

목록 보기
8/9

Error(오류)와 Exception(예외)

📌 Error(오류)
시스템이 종료되어야 할 수준의 수습하기 힘든 심각한 문제를 의미한다.
=> 컴파일 시 문법적인 오류와 런타임 시 널포인트 참조와 같은 오류로 프로세스에 심각한 문제를 야기시켜 프로세스를 종료시킬 수 있다.

📌 Exception(예외)
사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 의미한다.
=> 컴퓨터 시스템의 동작 도중 예기치 않았던 이상 상태가 발생하여 수행 중인 프로그램이 영향을 받는 것이다.

프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우를 프로그램 오류라 하고, 프로그램 오류는 에러(Error)와 예외(Exception) 두 가지로 구분할 수 있다.

Error는 메모리 부족(OutOfMemoryError)이나 스택오버플로우(StackOverflowError)와 같이 일단 발생하면 복구할 수 없는 심각한 오류이다. 에러는 JVM 실행에 문제가 생긴 것이므로 개발자가 대처할 방법이 없고, 미리 예측하여 방지할 수 밖에 없다.

반면 Exception은 발생하더라도 수습될 수 있는 비교적 덜 심각한 오류이다. 예외는 에러와 달리 문제가 발생하더라도 예외처리(Exception Handling)을 통해 프로그램의 비정상적인 종료 혹은 동작을 막을 수 있다.

자바에서는 try-catch문으로 예외 처리를 할 수 있다.

 

Throwable 클래스

오류와 예외 모두 자바의 최상위 클래스인 Object를 상속받고, 그 사이에는 Throwable 클래스와 상속관계가 있다.
Throwable 클래스는 오류나 예외에 대한 메시지를 담는다.
대표적으로 getMessage()와 printStackTrace()라는 메소드가 속해 있는데, 당연히 Throwable을 상속받은 Error와 Exception에서도 위 메소드를 사용할 수 있다.

 

Error(오류)

Error는 시스템 레벨에서 발생하여, 개발자가 어떻게 조치할 수 없는 수준을 의미한다.

StackOverflowError
응용 프로그램이 너무 많이 반복되어 StackOverflow가 발생할 때 던져지는 오류

OutOfMemoryError
JVM이 할당된 메모리의 부족으로 더 이상 객체를 할당할 수 없을 때 던져지는 오류
힙 사이즈 부족, 너무 많은 class를 로드, 가용가능한 swap이 없을 때, 큰 메모리의 native 메소드가 호출될 때 등
=> 이를 해결하기 위해 dump 파일분석, jvm 옵션 수정

 

Exception(예외)

예외는 개발자가 구현한 로직에서 발생하며 개발자가 다른 방식으로 처리가능한 것들로 JVM은 정상 동작한다.

Exception의 2가지 종류

  1. Checked Exception
    RuntimeException 이외에 있는 모든 예외
    IOException, SQLException 등
  • 예외처리가 필수이며, 처리하지 않으면 컴파일되지 않는다
    👉 try-catch로 감싸거나 throw로 던져서 예외처리
  • 컴파일 단계에서 명확하게 Exception 체크가 가능하다
  • 예외 발생시 트랜잭션을 롤백(rollback) 하지 않고 예외를 던져준다
  • JVM 외부와 통신(네트워크, 파일시스템 등)할 때 주로 쓰인다
  1. Unchecked Exception
    RuntimeException 하위의 모든 예외
    NullPointerException, IndexOutOfBoundException 등
  • 컴파일 때 체크되지 않고, Runtime에 발생하는 Exception을 말한다
  • 명시적인 예외처리를 하지 않아도 된다
  • 실행과정 중 어떠한 특정 논리에 의해 발견되는 Exception
  • 예외 발생시 트랜잭션을 롤백(rollback)한다

 

대표적인 Exception Class

  • NullPointerException
    Null 레퍼런스를 참조할 때 발생

  • IndexOutOfBoundsException
    배열과 유사한 자료구조(문자열, 배열, 자료구조)에서 범위를 벗어난 인덱스 번호 사용으로 발생

  • FormatException
    문자열, 숫자, 날짜 변환 시 잘못된 데이터로 발생하며, 보통 사용자의 입력, 외부 데이터 로딩, 결과 데이터의 변환 처리에서 자주 발생

  • ArthmeticException
    정수를 0으로 나눌때 발생

  • ClassCastException
    변환할 수 없는 타입으로 객체를 변환 시 발생

  • IllegalArgumentException
    잘못된 인자 전달 시 발생

  • IOException
    입출력 동작 실패 또는 인터럽트 시 발생

  • IllegalStateException
    객체의 상태가 매소드 호출에는 부적절한 경우에 발생

  • ConcurrentModificationException
    금지된 곳에서 객체를 동시에 수정하는것이 감지될 경우 발생

  • UnsupportedOperationException
    객체가 메소드를 지원하지 않는 경우 발생

 

Exception Handling

Java에서 모든 예외가 발생하면 (XXX)Exception 객체를 생성한다.
예외를 처리하는 방법에는 크게 2가지가 있다.

  1. 직접 try-catch를 이용해서 예외에 대한 최종적인 책임을 지고 처리하는 방식
  • try에는 위험한 로직, catch에는 예외 발생 시 수행할 로직이 들어간다
  • try 중이라도 예외가 발생한 다음의 코드들은 실행되지 않으며 catch 구문으로 넘어간다
  • catch구문은 else if처럼 여러개 쓸 수 있다
  • finally는 마지막에 실행하고 싶은 로직이 들어가며, 대표적으로 .close() 가 있다
  1. throws Exception을 이용해서 발생한 예외의 책임을 호출하는 쪽이 책임지도록 하는 방식 (주로 호출하는 쪽에 예외를 보고할 때 사용)
    다른 메소드의 일부분으로 동작하는 경우엔 던지는 것을 추천
  • 예외 처리를 현재 메소드가 직접 처리하지 않고 호출한 곳에다가 예외의 발생 여부를 통보한다.
    호출한 메소드는 이걸 또 던질건지 직접 처리할 건지 정해야한다. (return보다 강력하다.)
// try - catch 로 예외처리
public static void fileOpen() {
    // 파일을 열고 쓰고 닫는 아주 단순한 로직이어도 
    // 이에 대한 예외는 checked exception으로 분류 되기 때문에
    // 반드시 try - catch로 감싸주어야 한다.
    try {
        FileWriter file = new FileWriter("data.txt");
    	file.write("Hello World");
    	file.close();
    } catch(IOException e) {
    	e.printStackTrace();
    }
}

// ---------------------------------------------------------

// throws 로 예외처리
public static void fileOpen() throws IOException {
    // 파일을 열고 쓰고 닫는 아주 단순한 로직이어도
    // 이에 대한 예외는 checked exception으로 분류 되기 때문에
    // 반드시 try - catch로 감싸주어야 한다.
    FileWriter file = new FileWriter("data.txt");
    file.write("Hello World");
    file.close();
}

 

[참고자료]

링크1🔗
링크2🔗
링크3🔗

0개의 댓글