Java 에러와 예외

Chunbae·2025년 1월 14일
0

Java

목록 보기
9/11
post-thumbnail

프로그래밍 오류

프로그램에서 오류가 발생하게 되면 원치않는 버그가 발생하거나 심한 경우 프로그램이 강제 종료되는 상황도 발생하게 됩니다.
오류는 내부적 요인과 외부적 요인을 통해 발생하고 프로그래밍에서 오류가 발생하는 이유는 크게 3가지로 분류 됩니다.

  • Compile Time Error
    컴파일시 발생하는 오류

  • Runtime Error
    실행 시 발생하는 오류

  • Logical Error
    의도와 다르게 발생하는 논리적 오류


Compile Time Error

컴파일 단계에서 발생하는 에러로 컴파일러가 오류를 출력해줍니다.
주로 문법적 오류에 의해 발생하고 ;이나 선언되지 않은 변수를 사용하게 되면 아래와 같이 에러가 발생했다고 알려줍니다.

컴파일오류는 실행전에 식별이 가능하기 때문에 개발 진행시 쉽게 해결이 가능합니다.


Logical Error

프로그램이 기획의도와 다르게 실행되는 오류로 "버그가 발생했다"라고 합니다.
논리적 오류는 컴파일/런타임 에러에서는 제대로 동작되기 때문에 쉽게 식별하지 못하고 개발자가 실행 결과를 통해 판단하거나 테스트 코드를 통해 로직을 확인하며 개발을 진행해야 합니다.


Runtime Error

프로그램 실행중 발생하는 "실행 오류"입니다.
컴퍼일러에 의해 식별되지 않거나 실행중 로직 설계 오류로 발생하는 에러입니다.

Java에서는 Runtime Error를 2가지로 분류해 처리하는데 분류기준은 다음과 같습니다.

  • Error : 프로그램 코드에 의해 수습 불가한 오류
  • Exception : 수습이 가능한 미약한 오류

Error는 주로 메모리 부족이나 오버플로우등이 발생하면 JVM에 의해 식별되기 때문에 미연에 방지하거나 대처가 불가능한 오류들을 말하며,
Exception은 로직의 오류에 의해 발생하게 되며 "예외처리"를 통해 비정상적인 종료를 방지 가능합니다.

Java에서 예외처리는 Try-Catch문 & Throws 를 사용하여 처리합니다.




예외 클래스

Java의 최상위 클래스 Object를 상속받아 Throwable 클래스를 통해 다양한 예외클래스 들이 계층 구조를 이루고 있습니다.

출처 : https://rollbar.com/blog/java-exceptions-hierarchy-explained/

Runtime Exception

예외 타입설명
ArithmeticException어떤 수를 0으로 나누는 것과 같이 비정상 계산 중 발생
NullPointerExceptionNULL 객체 참조 시 발생
IllegalArgumentException메소드의 전달 인자값이 잘못된 경우 발생
IllegalStateException객체의 상태가 메소드 호출에는 부적합한 경우 발생
IndexOutOfBoundsExceptionindex 값이 범위를 넘어갈 경우 발생
UnsupportedOperationException객체가 메소드를 지원하지 않은 경우 발생
SecurityException보안 위반 발생 시 보안 관련 프로그램에서 발생
ProviderException구성 공급자 오류 시 발생
NoSuchElementException구성 요소가 더 이상 없는 경우 발생
ArrayStoreException객체 배열에 잘못된 객체 유형 저장 시 발생
ClassCastException클래스 간의 형 변환 오류 시 발생
EmptyStackException스택이 비어있는데 요소를 제거하려고 할 시 발생

ArrayIndexOutOfBoundsException

  • 배열의 범위를 넘어선 인덱스를 참조 시 발생하는 예외

ArithmeticException

  • 정수를 0으로 나누는 경우 발생하는 예외

NullPointException

  • null객체에 접근해 호출하는 경우 발생하는 예외
  • Java에서 가장 흔하게 발생하는 예외

NumberFormatException

  • 정수가 아닌 문자열을 정수로 형변환시 발생하는 예외
  • 문자를 치환하는 경우에 자주 발생


Compile Exception

예외 타입설명
IOException입출력 작업 중 발생하는 일반적인 예외 (파일 읽기/쓰기 등)
FileNotFoundException파일을 찾을 수 없을 때 발생 (IOException의 하위 클래스)
SQLException데이터베이스 작업 중 발생하는 예외
ClassNotFoundException클래스 파일을 로드할 수 없을 때 발생
InterruptedException스레드가 실행을 기다리는 중 인터럽트가 발생할 때 발생
MalformedURLException잘못된 URL 형식일 때 발생
UnknownHostException잘못된 호스트 이름을 사용하거나 호스트를 찾을 수 없을 때 발생
CloneNotSupportedException객체가 Cloneable 인터페이스를 구현하지 않았을 때 복제 시도 시 발생
InstantiationException추상 클래스나 인터페이스를 인스턴스화하려고 할 때 발생
NoSuchMethodException호출하려는 메서드가 존재하지 않을 때 발생
IllegalAccessException클래스나 메서드에 접근할 수 없는 경우 발생

IOException

  • 입출력 작업 중 발생하는 예외
  • I/O에 대한 규정은 까다롭기 때문에 예외처리가 반드시 필요함

SQLException

  • 데이터베이스 연결시 발생하는 예외


Checked / UnChecked Exception

Exception은 "예외처리 필수 유무"에 따라 한번더 분류를 진행합니다.

반드시 예외처리를 해야하는 경우는 Checked로 아닌 경우에는 UnChecked로 분류됩니다.

구분Checked ExceptionUnchecked Exception
처리 의무반드시 처리 (컴파일 단계에서 강제)선택적 처리 (처리하지 않아도 실행 가능)
발생 시점컴파일 단계실행 단계
대표 예시IOException, SQLExceptionNullPointerException, ArithmeticException
예외 처리 방식try-catch 또는 throws선택적으로 try-catch 사용

예외처리

Java에서 예외처리는 Try-Catch를 사용하여 로직을 감싸서 개발자가 직접 예외처리를 진행하는 방법과 Throws를 사용해 클래스 단에서 상위클래스로 예외처리를 위임하는 방법이 있습니다.

  • Try - Catch
    • 예외를 메서드 내부에서 바로 처리
    • 예외 발생 시 프로그램이 종료되지 않고 처리 후 실행을 이어감.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class TryCatchExample {
    public static void main(String[] args) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader("example.txt"));
            String line = reader.readLine();
            System.out.println("파일 내용: " + line);
            reader.close();
        } catch (IOException e) {
            System.out.println("IOException 발생: 파일을 읽을 수 없습니다.");
            e.printStackTrace();
        }
    }
}

  • Throws
    • 예외처리를 상위 호출자에 위임하여 처리
    • try-catch보다는 깔끔하지만 외부에서 처리하기 때문에 처리 결과를 사용자화 하기 어려움
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ThrowsExample {
    public static void main(String[] args) {
        try {
            readFile();
        } catch (IOException e) {
            System.out.println("IOException 발생: 파일을 읽을 수 없습니다.");
            e.printStackTrace();
        }
    }

    public static void readFile() throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader("example.txt"));
        String line = reader.readLine();
        System.out.println("파일 내용: " + line);
        reader.close();
    }
}

Reference

https://rollbar.com/blog/java-exceptions-hierarchy-explained/
https://www.w3schools.com/java/java_ref_errors.asp

profile
말하는 감자

0개의 댓글