[Java] 예외처리 (Exception Handling)

Ogu·2023년 5월 15일
0

Java

목록 보기
4/6

자바에서 예외(exception) 란 사용자의 잘못된 조작이나 개발자의 실수로 인해 발생하는 프로그램 오류를 말합니다. 오류를 무시하거나, 예외 처리를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 하거나 하고 싶을 때가 있을 것입니다. 자바에서는 try ... catch, throw 구문을 이용해 예외를 처리 할 수 있습니다.

Exception의 종류

FileNotFoundException

존재하지 않는 파일을 열려고 시도하면 FileNotFoundException 예외가 발생합니다.

ArithmeticException

예를 들어, 4를 0으로 나누면 ArithmeticException 예외가 발생한다.

ArrayIndexOutOfBoundsException

배열에서 인덱스 범위를 초과하여 사용할 때 발생합니다

ClassCastException

허용되지 않는데 억지로 타입 변환을 시도할 경우 발생합니다.

NumberFormatException

매개값인 문자열이 숫자로 변환될 수 있다면 숫자를 정상적으로 리턴하지만, 숫자로 변환할 수 없는 문자열이 포함되어 있으면 java.lang.NumberFormatException을 발생시킵니다.

String data1 = "123";
String data2 = "숫자를 문자로 바꾸기";
int val1 = Integer.parseInt(data1);
int val2 = Integer.parseInt(data2); //NumberFormatException 발생

NullPointerException(java.lang.NullPointerException)

생성되지 않은 객체 인스턴스를 참조할 때 발생합니다. null 값을 갖는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생합니다.

ArrayIndexOutOfBoundsException

배열에서 인덱스 범위를 초과하여 사용할 때 발생합니다.

int[] arr = new int[3]; 
arr[4]=5; // ArrayIndexOutOfBoundsException 

의외에도 다양한 종류의 Exception이 있습니다.

예외 처리하기 - [try-catch]

try-catch 기본 구조

try {
    ...
} catch(예외1) {
    ...
} catch(예외2) {
    ...
}

try 문안의 수행할 문장들에서 예외가 발생하지 않는다면 catch문에 속한 문장들은 수행되지 않습니다. 하지만 try 문안의 문장을 수행하는 도중에 예외가 발생하면 예외에 해당되는 catch문이 수행됩니다.

ex) ArithmeticException

int c;
try {
    c = 4 / 0;
} catch(ArithmeticException e) {
    c = -1;  // 예외가 발생하여 이 문장이 수행된다.
}

finally

프로그램 수행 도중 예외가 발생하면 프로그램이 오류에 의해 중지되거나 예외 처리에 의해 catch 구문이 실행된다. 하지만 어떤 예외가 발생하더라도 반드시 실행되어야 하는 구문이 있다면 finally 내부에 작성합니다.

public class Sample {
    public void shouldBeRun() {
        System.out.println("this should be run");
    }

    public static void main(String[] args) {
        Sample sample = new Sample();
        int c;
        try {
            c = 4 / 0;
            sample.shouldBeRun();  // 이 코드는 실행되지 않는다.
        } catch (ArithmeticException e) {
            c = -1;
        }
    }
}

예외 던지기 - throw

메소드 내부에서 예외가 발생할 수 있는 코드를 작성할 때, try-catch 블록으로 예외 처리 하는 것이 기본이지만, 경우에 따라서는 메소드를 호출한 곳으로 예외 처리를 떠넘길 수도 있습니다. 이 때 throw 키워드를 사용하여 메서드를 호출한 곳으로 예외 처리를 떠넘깁니다.

class FoolException extends Exception {
}

public class Sample {
    public void sayNick(String nick) throws FoolException {
        if("fool".equals(nick)) {
            throw new FoolException();
        }
        System.out.println("당신의 별명은 "+nick+" 입니다.");
    }

    public static void main(String[] args) {
        Sample sample = new Sample();
        try {
            sample.sayNick("fool");
            sample.sayNick("genious");  // 이 문장은 수행되지 않는다
        } catch (FoolException e) {
            System.err.println("FoolException이 발생했습니다.");
        }
    }
}
profile
私はゲームと日本が好きなBackend Developer志望生のOguです🐤🐤

0개의 댓글