본문 바로가기
Programming/Java

자바 예외처리

by Tarake 2024. 8. 6.

예외처리(Exceotion Handling)


class Main {
    public static void main(String[] args) {
        try {
            int[] numbers = new int[5];
            numbers[10] = 30; // ArrayIndexOutOfBoundsException 발생
        } 
        catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("오류 발생: " + e.getMessage());
        } 
        finally {
            System.out.println("이곳은 항상 실행됩니다.");
        }
    }
}

자바에서 예외 처리는 프로그램 실행 중에 발생할 수 있는 예외 상황을 안정적으로 처리하기 위한 메커니즘입니다. 예외 처리를 통해 프로그램의 비정상 종료를 방지하고, 오류가 발생했을 때 적절한 조치를 취할 수 있습니다. 자바에서는 try, catch, finally, 그리고 throw와 throws 키워드를 사용하여 예외를 처리합니다.

 

예외 처리의 구성 요소

  • try : 예외가 발생할 가능성이 있는 코드를 포함합니다. 예외가 발생하면 즉시 실행이 중단되고 해당 try 블록에 매칭되는 catch 블록으로 제어가 이동합니다.
  • catch : 정 타입의 예외를 처리하는 코드를 포함합니다. try 블록에서 발생한 예외를 적절히 처리하거나, 추가적인 처리를 수행한 후 프로그램을 계속 실행할 수 있습니다.
  • finally : 예외 발생 여부와 관계없이 실행되는 코드를 포함합니다.
  • throw : 사용자가 직접 예외를 발생시키기 위해 사용합니다. 이를 통해 특정 상황에서 커스텀 예외를 발생시킬 수 있습니다.
  • throws : 메드 선언 시 사용되며, 해당 메소드 내에서 처리되지 않고 던져질 예외를 명시합니다. 이는 메소드를 사용하는 쪽에서 해당 예외를 처리하도록 강제합니다.

throw와 throws

throw 키워드는 예외 객체를 명시적으로 발생시키는 데 사용됩니다. 프로그래머가 직접 특정 조건에서 예외를 발생시킬 때 사용하며, 이 예외는 try-catch 블록 내에서 처리되거나 메소드 호출자에게 전파됩니다.

throws 키워드는 throws 키워드는 메소드 선언부에 사용되어, 해당 메소드가 던질 수 있는 예외 타입을 명시합니다. 이는 예외가 메드 내부에서 처리되지 않고 호출자에게 전파될 때 사용됩니다.

 

예시

import java.io.*;

public class FileReaderExample {
    public static void main(String[] args) {
        try {
            readFile("test.txt");
        } catch (IOException e) {
            System.out.println("IOException: " + e.getMessage());
        }
    }

    public static void readFile(String fileName) throws IOException {
        FileReader fileReader = new FileReader(fileName); // checked exception
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
        bufferedReader.close();
    }
}

메인에서 throws IOException할 경우 JVM에서 에러를 처리하며 계속해서 throws하며 예외를 넘기는 방법을 스택 롤백이라고 합니다.

 

자바에서 예외란?


System.out.print("정수 A를 입력하세요 : );
int A = scanner.nextInt();

위 에 코드는 문법적으로는 문제가 없습니다. 하지만 사용자가 정수가 아닌 문자를 입력하게 되면 프로그램에 예외가 발생하게 됩니다.  이러한 상황이 발생하면 자바는 예외가 발생한 내용을 출력하고 종료되게 됩니다.

 

예외를 처리하는 방법


try {
    예외가 발생할 수 있는 부분
}
catch (예외 클래스 e) {
    처리 영역
}

자바에서는 예외 상황마다 알려주는 클래스가 정의되어 있습니다. 이런 클래스를 예외 클래스라고 합니다. 

try 부분에는 예외가 발생할 수 있는 코드를 작성해서 동작 중에 예외가 발생하면 가상머신에서는 해당 예외에 해당하는 인스턴스를 생성해서 catch 구문의 매개변수 e에 전달하게 됩니다. 이러면 가상머신은 예외처리된 것으로 간주하고 실행이 종료되지 않고 계속됩니다.

 

둘 이상의 예외처리


try {
    여러가지 예외가 발생할 수 있는 영역
}
catch (예외상황1 e) {
    예외상황1에 대한 처리
}
catch (예외상황2 e) {
    예외상황2에 대한 처리
}
// 혹은
catch(예외상황1 | 예외상황2 e) {
    예외상황 처리
}

위의 코드처럼 예외상황이 한 개가 아닌 둘 이상이라면 catch문을 연달아 사용해서 발생할 수 있는 예외에 대한 예외 클래스를 사용해서 처리하면 됩니다. catch문을 연달아 사용하는 것이 아닌 | 를 사용해서 하나의 catch문을 사용해서 예외를 처리할 수 도 있습니다.

 

사용자가 직접 예외 정의


class CustomException extends Exception {
    public CustomException() {
        super("예외처리");
    }
}

class Main {
    public static void main(String[] args) {
        try {
            예외 발생 영역
            throw // 예외를 발생시킨다.
        }
        catch(CustomException e) {
            System.out.println(e.getMessage());
        }
    }
}

사용자가 예외를 직접 정의할 수 있습니다. 보통의 class를 만들 듯이 클래스와 생성자를 만들면 됩니다. 하지만 중요한점은 모든 예외의 슈퍼클래스인 Exception 클래스를 상속받아야 한다는 점입니다.

 

 

 

 

출처

W3school

 

W3Schools.com

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

'Programming > Java' 카테고리의 다른 글

메모리 모델과 Object 클래스  (0) 2024.08.08
인터페이스와 추상 클래스  (0) 2024.08.07
상속  (0) 2024.08.06
배열  (0) 2024.08.05
문자열 클래스  (0) 2024.08.03