개발일지/Java

Java 예외 처리 (Exception Handling)

E-room 2022. 9. 14. 21:47
728x90

프로그램의 비정상적인 종료를 방지하고, 정상적인 실행 상태를 유지하기 위하여 수행

 

컴파일 에러

컴파일할 때 발생하는 에러

 

주로 세미콜론 생략, 오탈자, 잘못된 자료형, 잘못된 포맷 등 문법적인 문제를 가리키는 신택스(syntax) 오류로부터 발생한다

 

아래 코드는 for문을 닫는 괄호가 없다

public class ErrorTest {
    public static void main(String[] args) {
        int i;

        for (i= 1; i<= 5; i++ {
            System.out.println(i);
        }

    }
}

런타임 에러

프로그램이 실행될 때 만나는 에러

public class RuntimeErrorTest {

    public static void main(String[] args) {
        System.out.println(4 * 4);
        System.out.println(4 / 0); // 예외 발생
    }
}

//출력값
16
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at RuntimeErrorTest.main(RuntimeErrorTest.java:5)

 

에러와 예외

넓은 의미에서 프로그램 실행 시 발생할 수 있는 모든 문제를 에러라 부르지만,

자바에서는 에러(error)와 예외(exception)로 구분한다.

 

에러 : 복구하기 어려운 수준의 심각한 오류 ex) 메모리 부족, 스택오버플로우

예외 : 잘못된 사용 또는 코딩으로 인한 상대적으로 미약한 수준의 오류로서 코드 수정 등을 통해 수습이 가능한 오류


예외 클래스의 상속 계층도

try - catch문

모든 예외를 받을 수 있는 Exception 클래스 하나로도 처리가 가능하며

각기 다른 종류의 예외를 하나 이상의 catch블록을 사용하여 처리할 수 있음

 

기본 구조

try {
    // 예외가 발생할 가능성이 있는 코드를 삽입
} 
catch (ExceptionType1 e1) {
    // ExceptionType1 유형의 예외 발생 시 실행할 코드
} 
catch (ExceptionType2 e2) {
    // ExceptionType2 유형의 예외 발생 시 실행할 코드
} 
finally {
    // finally 블럭은 없어도 됨
    // 예외 발생 여부와 상관없이 항상 실행
}

예제

public class RuntimeExceptionTest {

    public static void main(String[] args) {

        try {
            System.out.println("[소문자 알파벳을 대문자로 출력하는 프로그램]");
            printMyName(null); // (1) 예외 발생
            printMyName("abc"); // 이 코드는 실행되지 않고 catch 문으로 이동
        } 
        catch (ArithmeticException e) {
            System.out.println("ArithmeticException 발생!"); // (2) 첫 번째 catch문
        } 
        catch (NullPointerException e) { // (3) 두 번째 catch문
            System.out.println("NullPointerException 발생!"); 
            System.out.println("e.getMessage: " + e.getMessage()); // (4) 예외 정보를 얻는 방법 - 1
            System.out.println("e.toString: " + e.toString()); // (4) 예외 정보를 얻는 방법 - 2
            e.printStackTrace(); // (4) 예외 정보를 얻는 방법 - 3
        } 
        finally {
            System.out.println("[프로그램 종료]"); // (5) finally문
        }
    }

    static void printMyName(String str) {
        String upperCaseAlphabet = str.toUpperCase();
        System.out.println(upperCaseAlphabet);
    }
}

// 출력값
[소문자 알파벳을 대문자로 출력하는 프로그램]
NullPointerException 발생!
e.getMessage: null
e.toString: java.lang.NullPointerException
[프로그램 종료]
java.lang.NullPointerException
	at RuntimeExceptionTest.printMyName(RuntimeExceptionTest.java:20)
	at RuntimeExceptionTest.main(RuntimeExceptionTest.java:7)

 

728x90