JAVA의 Exception

 

 

예외(Exception)

Java에서 예외는 프로그램 실행 중에 발생할 수 있는 예기치 않거나 예외적인 상황을 처리하는 방법입니다. 이러한 상황에는 0으로 나누기, 범위를 벗어난 배열 액세스 또는 존재하지 않는 파일 열기 시도와 같은 오류가 포함될 수 있습니다.

Java는 이러한 예외 조건을 적절하게 포착하고 관리할 수 있는 강력한 예외 처리 메커니즘을 제공합니다. Java 예외 처리의 핵심 개념은 try, catch 및 선택적으로 finally의 세 가지 키워드 사용을 기반으로 합니다.

다음은 Java에서 예외 처리가 작동하는 방식에 대한 분석입니다.

 

 


try

잠재적으로 예외를 발생시킬 수 있는 코드 블록을 try 블록으로 묶습니다.

try {
    // Code that might throw an exception
} catch (ExceptionType1 ex1) {
    // Code to handle ExceptionType1
} catch (ExceptionType2 ex2) {
    // Code to handle ExceptionType2
} finally {
    // Code that will always be executed, regardless of whether an exception occurred or not
}

try 블록에는 예외를 발생시킬 수 있는 코드가 포함되어 있습니다. try 블록 내에서 예외가 발생하면 프로그램은 예외 유형에 따라 적절한 catch 블록으로 이동합니다.

 

catch

try 블록 내에서 예외가 발생하면 일치하는 catch 블록에 의해 포착됩니다. 각 catch 블록은 처리할 수 있는 특정 예외 유형과 연결됩니다. 다양한 유형의 예외를 처리하기 위해 단일 try 블록 다음에 여러 catch 블록을 가질 수 있습니다.

 

finally

finally 블록은 선택 사항이며 catch 블록 다음에 옵니다. 여기에는 예외 발생 여부에 관계없이 항상 실행되는 코드가 포함되어 있습니다. 이 블록은 일반적으로 파일 닫기 또는 리소스 해제와 같은 정리 작업에 사용됩니다.
다음은 간단한 예입니다.

public class ExceptionExample {
    public static void main(String[] args) {
        try {
            int result = divide(10, 0);
            System.out.println("Result: " + result);
        } catch (ArithmeticException ex) {
            System.out.println("Exception caught: " + ex.getMessage());
        } finally {
            System.out.println("Finally block executed.");
        }
    }
    
    public static int divide(int dividend, int divisor) {
        return dividend / divisor;
    }
}

 

이 예에서 ‘divide’ 메서드는 나눗셈을 수행하려고 시도하며, 제수가 0인 경우 ‘ArithmeticException’이 발생할 수 있습니다. 예외는 catch 블록에서 발견되고 프로그램은 finally 블록으로 진행합니다.

 

Checked, Unchecked Exception

Java에서 예외는 확인된(checked) 예외와 확인되지 않은(unchecked) 예외(런타임 예외)의 두 가지 주요 유형으로 분류됩니다.

 

확인된 예외(Checked Exception)

확인된 예외는 Java 컴파일러에서 명시적으로 처리하도록 요구하는 예외입니다. 이러한 예외는 Exception 클래스의 하위 클래스이지만 RuntimeException의 하위 클래스는 아닙니다. 메서드가 확인된 예외를 throw할 수 있는 경우 메서드 서명에서 throws 키워드를 사용하여 해당 예외를 선언해야 합니다. 이는 호출 코드에 예외를 처리하거나 전파해야 함을 알립니다.

확인된 예외의 예로는 IOException, SQLException 및 ClassNotFoundException이 있습니다. 이러한 예외는 일반적으로 파일을 찾을 수 없음, 데이터베이스 연결 실패 등과 같이 예상하고 처리할 수 있는 조건을 나타냅니다.
다음은 확인된 예외를 처리하는 예입니다.

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class CheckedExceptionExample {
    public static void main(String[] args) {
        try {
            readFile("example.txt");
        } catch (FileNotFoundException ex) {
            System.out.println("File not found: " + ex.getMessage());
        }
    }
    
    public static void readFile(String filename) throws FileNotFoundException {
        Scanner scanner = new Scanner(new File(filename));
        // Code to read and process the file
        scanner.close();
    }
}

 

확인되지 않은 예외(Unchecked Exception)

런타임 예외라고도 하는 확인되지 않은 예외는 throws 키워드를 사용하여 명시적으로 선언할 필요가 없고 컴파일러에 의해 시행되지 않는 예외입니다. 이들은 RuntimeException 클래스의 하위 클래스입니다. 이러한 예외는 일반적으로 프로그래밍 오류 또는 프로그래밍 계약 위반을 나타내며 런타임에 발생합니다.
확인되지 않은 예외의 예로는 NullPointerException, ArrayIndexOutOfBoundsException 및 ArithmeticException이 있습니다. 이러한 예외는 종종 프로그램 논리의 오류 또는 API의 부적절한 사용을 나타냅니다.
확인되지 않은 예외의 예는 다음과 같습니다.

public class UncheckedExceptionExample {
    public static void main(String[] args) {
        int[] numbers = { 1, 2, 3 };
        try {
            int result = numbers[5]; // This will throw ArrayIndexOutOfBoundsException
            System.out.println("Result: " + result);
        } catch (ArrayIndexOutOfBoundsException ex) {
            System.out.println("Array index out of bounds: " + ex.getMessage());
        }
    }
}

 

컴파일러가 확인되지 않은 예외를 처리하도록 강제하지는 않지만 코드에서 이를 적절하게 처리하여 보다 강력하고 사용자 친화적으로 만들어야 한다는 점에 유의하는 것이 중요합니다. 또한 확인되지 않은 예외를 발생시킬 수 있는 메서드를 설계하는 경우 다른 개발자가 잠재적인 문제를 이해하는 데 도움이 되도록 잘 문서화하는 것이 좋습니다.

 

 

 

요약하면, 확인된 예외는 컴파일 시간에 적용되며 처리 또는 선언되어야 하는 반면, 확인되지 않은 예외(런타임 예외)는 선언할 필요가 없으며 프로그래밍 오류 또는 예기치 않은 조건으로 인해 프로그램 실행 중에 발생할 수 있습니다.

 

좋은 예외 처리는 코드의 견고성과 유지 관리성을 향상시킨다는 점을 기억하십시오. 이를 통해 프로그램은 오류를 정상적으로 처리하고 예기치 않은 상황에서 복구할 수 있습니다.