Java

예외 처리하기와 미루기

yanJuicy 2024. 8. 24. 00:55
반응형

try-catch

try 블록에는 예외가 발생할 가능성이 있는 코드를 작성하고 예외가 발생하면 catch 블록이 수행된다

public class ArrayExceptionHandling {

    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};

        try {
            for (int i = 0; i <= 5; i++) {
                System.out.println(arr[i]);
            }
        } catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
        }

        System.out.println("정상 종료");
    }

}

try-catch-finally

finally 블록에서 파일을 닫거나 네트워크를 닫는 등 리소스 해제를 구현한다

try 블록이 수행되면 finally 블록은 항상 수행된다

여러개의 예외 블록이 있는 경우, 각각에서 리소스를 해제하지 않고 finally 블록에서 해제하도록 구현한다

catch 블록에 return이 있어도 finally 블록은 실행된다

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileExceptionHandling {

    public static void main(String[] args) {
        FileInputStream fis = null;

        try {
            fis = new FileInputStream("a.txt");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }

            System.out.println("finally 항상 수행");
        }

        System.out.println("여기도 수행");
    }

}

try-with-resources

리소스를 사용하는 경우 close() 하지 않아도 자동으로 해제 되도록 한다

리소스를 try() 내부에 선언해야 한다

try 블록에서 열린 리소스는 정상적인 경우나 예외가 발생한 경우 모두 자동으로 해제된다

해당 리소스 클래스가 AutoCloseable 인터페이스를 구현해야한다

자바 9부터 리소스는 try() 외부에서 선언하고 변수만 try(obj)와 같이 사용할 수 있다

class AutoCloseObj implements AutoCloseable {

    @Override
    public void close() throws Exception {
        System.out.println("리소스가 close() 됐습니다");
    }
}

public class AutoCloseTest {

    public static void main(String[] args) {
        AutoCloseObj obj = new AutoCloseObj();

        try (obj) {
            throw new Exception();
        } catch (Exception e) {
            System.out.println("예외 부분");
        }
    }

}

예외 처리 미루기

예외 처리는 예외가 발생하는 문장에서 try-catch 블록으로 처리하는 방법과 이를 사용하는 부분에서 처리하는 방법 두 가지가 있다

throws를 이용하면 예외가 발생할 수 있는 부분을 사용하는 코드에서 예외를 처리할 수 있다

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class ThrowsException {

    public static void main(String[] args) {

        ThrowsException test = new ThrowsException();

        try {
            test.locdClass("a.txt", "java.lang.String");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public Class locdClass(String fileName, String className) throws FileNotFoundException, ClassNotFoundException {
        FileInputStream fis = new FileInputStream(fileName);
        Class c = Class.forName(className);
        return c;
    }
}
반응형

'Java' 카테고리의 다른 글

로그 남기기  (0) 2024.08.26
사용자 정의 예외 클래스  (0) 2024.08.25
예외 처리  (0) 2024.08.23
직렬화  (0) 2024.08.23
멀티 Thread 동기화  (0) 2024.08.22