본문 바로가기

공부방/JAVA

예외처리

예외란 문법적인 오류는 없어 프로그램이 실행은 되지만 특수한 상황을 만나면 프로그램이 중단되는 현상을 말한다.

예외처리에 대해서 알아보기 전에 흔히 혼동할 수 있는 3가지 개념에 대해서 먼저 짚고 넘어가보자.

 

오류: 에러와 예외를 포괄하는 개념

에러: 프로그램 코드에 의해서 해결 할 수 없는 심각한 오류

예외: 특수한 상황이 발생하면 프로그램이 중단되는 현상으로 프로그램 코드에 의해서 해결 할 수 있는 오류

 

에러

에러는 컴파일 에러와 런타임 에러로 나뉘어 진다.

컴파일 에러: 문법, 자료형 등이 일치하지 않을 떄 발생하는 에러

런타임 에러: 컴파일은 완료하였지만, 실행도중에 발생하는 오류

 

자바는 런타임이 발생하는 오류를 에러와 예외로 구분하고 있다;

우리는 예외에 대해서 알아보도록 하자.

 

Runtime exception

Runtime exception은 다시 5가지로 나뉘어진다.

ClassCastException: 객체 형변환을 잘못한 경우

ArithmeticException: 0으로 나누는 경우

NeagativeArraySizeException: 배열의 크기가 음수인 경우

NullPointerException: null객체에 접근하는 경우

IndexOutofBoundException: 인덱스의 범위를 벗어난 경우

 

예외 처리

예외 처리는 try catch 구문으로 진행할 수 있다.

 

public class ExceptionEx {
    public static void main(String[] args) {
        try {
            int[] ary = { 1, 2, 3 };
            System.out.println(ary[3]);
            System.out.println(3 / 0);
        } catch (ArithmeticException e) {
            System.out.println("0으로 나눌 수 없음");
            // TODO: handle exception
        } catch (IndexOutOfBoundsException e) {
            System.out.println("인덱스 범위 초과");
        } catch (Exception e) {
            System.out.println("예외 발생");
        } finally {
            System.out.println("무조건 실행");
        }
    }

}

// 인덱스 범위 초과
// 무조건 실행

 

catch 구문은 여러개를 사용하여 여러 에러를 대처할 수 있다.

그러나 상위 catch 구문이 실행되는 순간 하위 catch 구문은 진행되지 않으니 가장 큰 범위의 Exception 인터페이스는 마지막에 쓰도록 한다.

finally는 예외가 발생해도 진행되고, 발생하지 않아도 진행되는 구문이다.

 

예외 강제 발생

사용자가 특정 상황에서 예외를 발생시키고 싶은 경우에 사용하는 방법이다.

 

public class ExceptionEx2 {
    public static void main(String[] args) {
        try {
            throw new Exception("예외발생 예외발생 긴급상황");
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println("예외를 강제로 발생시킨 상황입니다.");
            e.getMessage();
        }
        System.out.println("프로그램 종료");
    }

}
// 예외를 강제로 발생시킨 상황입니다.
// 프로그램 종료

 

Exception 객체를 생성할 때 생성자에 문자열 값을 넣어주게 되면 getMessage 매서드를 이용하여 출력할 수 있다.

 

예외 발생

public class ExceptionEx3 {
    public static void main(String[] args) {
        try {
            first();
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println("main class 에서 예외 처리중!!!");
        }

    }

    static void first() throws Exception {
        try {
            second();
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println("first class에서 예외 처리중!!!");
            System.out.println(e.getMessage());

        }
    }

    static void second() throws Exception {
        try {
            throw new Exception("제가 강제로 예외 발생시켰어요!!!");
        } catch (Exception e) {
            System.out.println("second class에서 예외 처리중!!!");
            throw e;
            // TODO: handle exception
        }
    }
}

// second class에서 예외 처리중!!!
// first class에서 예외 처리중!!!
// 제가 강제로 예외 발생시켰어요!!!

위 코드는 main -> first -> second -> first -> main 의 순서로 진행되고 있다.

second class까지 진행이 되었을 때 에러가 발생하였고 try 에서 catch 구문으로 이동한다.

catch 구문에서는 새로운 에러를 강제로 발생시키고 있으며 이 에러는 클래스에서 정의한 throw Excetpion을 통하여 first class로 전달이 된다.

first class의 catch 구문이 작동이 되고 이때 getMessage가 print 되는 것을 확인할 수 있다.

 

사용자 정의 예외 클래스

 

public class LoginException extends Exception {
    LoginException(String msg) {
        super(msg);
    }
}

 

 

import java.util.Scanner;

public class ExceptionEx4 {
    static final String userId = "1234";
    static final String userPasswd = "1234pw";

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        try {
            System.out.println("id 를 입력하세요");
            String id = sc.nextLine();
            System.out.println("password 를 입력하세요");
            String passwd = sc.nextLine();
            if (!userId.equals(id)) {
                throw new LoginException("id가 일치하지 않습니다.");
            } else if (!userPasswd.equals(passwd)) {
                throw new LoginException("passwd가 일치하지 않습니다.");
            }
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println(e.getMessage());

        }

    }

}

// id 를 입력하세요
// 1234
// password 를 입력하세요
// 1234
// passwd가 일치하지 않습니다.

 

'공부방 > JAVA' 카테고리의 다른 글

mysql  (0) 2022.07.07
Map, Hash table  (0) 2022.06.19
일급 컬렉션  (0) 2021.08.15
[JAVA] enum 이란?  (0) 2021.07.14
상속  (0) 2021.07.13