본문 바로가기
공부기록

4월 20일 Java - 예외 처리

by project100 2023. 4. 20.

예외처리(Exception Handing)

예외(Exception)란?

프로그램의 오류(Error)

1) 컴파일 오류(문법 오류) - 코드를 작성할 때 발생하는 오류(컴파일이 되지 않는다. 실행불가)

2) 런타임 오류(실행 오류) - 컴파일 완료 후 실행(Run-time)시 발생하는 오류

 Bug(버그) - 실행은 되나 결과에 이상 발생

 Exception(예외) - 비정상적으로 종료, 예방 코드로 수습 가능한 오류

 

예외 처리란 예방 코드를 미리 작성하여 예외로 인한 비정상적인 종료를 막는 작업

 

예외 처리용 명령어

1) try : 예외사항이 발생할 여지가 있는 코드를 묶어 놓은 영역

2) catch : 발생된 예외사항에 대한 조치 명령을 작성하는 영역

3) finally : 예외와 상관없이 처리해야 할 명령을 작성하는 영역, 처리해야 할 명령이 없을 경우 생략 가능

 

작성문법

try {

   예외사항이 발생할 여지가 있는 문장들(한문장만 들어갈 수도 있음, 연관된 문장도 같이 넣어도 된다.)

} catch(예외사항 클래스1 참조변수) {

  예외사항 조치를 위한 명령 문장] - 없을수도 있음

} [catch(예외사항 클래스2 참조변수) {

  예외사항 조치를 위한 명령 문장들

} ... { // 또 다른 예외사항들

....

} finally {

  예외와 관계없이 실행해야 하는 명령 문장들

}]

 

1. try, many catch, 1. finally

 

try에 넣어놓은 문장 중 오류가 발생하면 바로 catch로 넘어간다.

finally는 이런 오류와 관계없이 실행해야하는 문장으로 생략 가능

 

Exception 클래스 :  모든 예외 사항 클래스의 부모 클래스, 어떤 예외 사항이던 다 처리할 수 있는 클래스

자바는 객체지향이기 때문에 예외사항도 객체로 처리한다.

주요 예외사항들은 모두 클래스로 미리 정의되어 있다.

1) NumberFormatException : 문자열을 숫자로 변환할 때 발생

2) ArithmeticException : 산술연산 시 발생(예 나눗셈을 0으로 했을 경우)

3) NullPointException : 참조변수에서 인스턴스가 없을 때 발생(예 참조변수에 null을 넣고 사용하는 경우)

4) IndexOutoBoundException : 배열의 크기와 관련하여 발생(예 10개 배열인데 12번째를 가지고 오라고 할 때)

5) ClassNotFoundException : 인스턴스 생성에 필요한 클래스가 없을 때 발생(예 클래스명 오타)

6) IOException : 입출력에 문제가 있을 경우 발생(파일 IO)

7) SQLException : DB연동 관련하여 발생

 

 

예) NumberFormatException

 

import java.util.Scanner;

public class ExceptionHandlingEx {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = null;
        int num = 0;

        System.out.print("숫자 입력 : ");
        str = sc.nextLine();

        try {
            num = Integer.parseInt(str); // 숫자 변환
        } catch (NumberFormatException e){
            //System.out.println(e.getMessage());
            // 예외사항 관련 출력 메소드 printStackTrace()
            e.printStackTrace();
        }
        System.out.println("프로그램 끝!");
    }
}

예외사항 처리

import java.util.Scanner;

public class ExceptionHandlingEx {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = null;
        int num = 0;

        try {
            System.out.println("------ 입력 전 ------");
            System.out.print("숫자 입력 : ");
            str = sc.nextLine();
            System.out.println("------ 변환 전 -------");
            num = Integer.parseInt(str); // 숫자 변환
            System.out.println("------ 변환 후 -------");
            System.out.println("여러가지 작업들");
        } catch (Exception e){ // 예외사항 발생 시에만 실행
            // getClass로 출력된 내용을 토대로 어떤 예외인지 확인가능
            // NumberFormatException
            System.out.println(e.getMessage());
            System.out.println(e.getClass());
            // 예외사항 관련 출력 메소드 printStackTrace()
            // e.printStackTrace(); // 콘솔일 때는 안 쓴다.
        } finally {
            // 예외사항과 상관없이 실행
            System.out.println("예외처리 끝!");
        }
        System.out.println("프로그램 끝!");
    }
}

예외 처리 방식

1. 예외가 발생되는 메소드 내에서 처리를 완료하는 방식.

2. 예외 처리를 호출한 메소드에 위임(떠넘김)하는 방식.

메소드 선언부에 위임할 예외사항을 명시. 모든 예외사항을 넘길 경우 Exception을 작성.(throws )

 

제어접근자 반환형 메소드이름(매개변수목록) throws 예외사항클래스{

 ....

}

예외사항클래스가 여러개일 경우 , 로 구분하여 나열

모든 예외사항은 Exception 클래스로 처리가 가능

catch문에 Exception만 작성해도 된다. 

 

예를 들어, 총 5가지의 예외사항이 발생되는 문장 블록이 있다고 가정할 때, 

이중 2가지 예외 사항을 조치하기 위한 catch문을 작성하고

나머지 3가지 예외사항은 Exception 클래스로 처리할 수도 있다.

 

Exception 클래스를 사용하는 catch문의 순서는 마지막이어야 한다.(인텔리제이에서는 오류처리 해줌.)

try {
            System.out.print("N1 : ");
            str = sc.nextLine();
            n1 = Integer.parseInt(str);
            System.out.print("N2 : ");
            str = sc.nextLine();
            n2 = Integer.parseInt(str);
            r = n1 / n2;
            System.out.println("결과 : " + r);
        } catch (NumberFormatException e) {
            System.out.println("숫자를 입력하세요.");
        } catch (ArithmeticException ae) {
            System.out.println("0으로 나눌 수 없습니다.");
        } catch (Exception ee){// Exception이 제일 나중에 와야 한다. 부모
            System.out.println("예외사항이 있음. 관리자 문의");
        }
        finally {
            System.out.println("나눗셈 종료. 이전 메뉴로");
        }

 

실습)

간이 프로젝트에 예외처리를 적용해보자!