본문 바로가기
프로그래밍/Java

Java - 예외처리 (1)

by 왕거 2020. 7. 12.

이 다음에도 강의가 이렇게 길지는 모르겠는데 지금까지 중에선 제일 길어서 나눠서 정리해야겠다.

 

예외처리의 기본

  • 예외란?  -  사용자가 개발자의 예상과 다른 조작 또는 행동으로 인해서 생기는 상황으로 문법적인 오류가 아님
  • 예외처리란?  -  위와 같이 정의된 예외가 발생한 상황에 대한 처리
  • 자바의 기본 예외처리
    • 예외가 발생한 지점과 발생한 예외에 대한 정보 안내
    • 프로그램 종료
  • if - else 문을 통해서 예외를 처리할 수 있으나, 이 경우에 코드의 다른 부분에 사용된 if - else 문과 목적을 따로 구별해야 하는 수고가 발생한다.  ->  따라서 예외처리를 위한 문법이 제공됨
  • JVM이 예외를 처리하는 방식은 OS가 인터럽트를 처리하는 방식과 유사하다.
    • 예외가 발생하면 예외처리를 위한 작업을 먼저 진행한 후에 발생지점 직후로 복귀
  • 예외처리를 위한 클래스 제공
    • 수학 연산과정 중의 예외  -  java.lang.ArithmeticException
    • 데이터 입력과정에서의 예외  -  java.util.InputMismatchException
    • 배열 인덱스 초과 예외  -  java.lang.ArrayIndexOutOfBoundsException
    • 클래스간 형변환 예외  -  java.lang.ClassCastException
    • 널포인트 예외  -  java.lang.NullPointerException
    • 예외 발생 시 호출되는 클래스의 이름들을 잘 보면 원인을 쉽게 파악할 수 있다.

 

try - catch 문

  • 예외처리를 위한 문법
  • try {Target Code}
  • catch(__TYPE_OF_EXCEPTION__ e) {Exception handling}
    • catch의 경우 하나의 try에 여러개를 사용가능하고, 하나의 catch문에 여러 예외조건을 걸 수 있다.
  • try문은 최소한 하나 이상의 catch문을 사용해야만 함
import java.util.InputMismatchException;
import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        
        try {
            System.out.print("a/b...a?");
            int n1 = kb.nextInt();
            System.out.print("a/b...b?");

            int n2 = kb.nextInt();
            System.out.printf("%d / %d = %d", n1, n2, n1/n2);
        }
        //아래로 주석 처리된 부분과 안된 부분 둘 다 같은 동작
        // catch(ArithmeticException e) {
        //     System.out.println(e.getMessage());
        // }
        // catch(InputMismatchException e) {
        //     System.out.println(e.getMessage());
        // }
        catch(ArithmeticException | InputMismatchException e) {
            System.out.println(e.getMessage());
        }
        System.out.println("Good Bye!");
        kb.close();
    }
}

 

자바의 예외처리

  1. 예외가 발생했을 때 해당 예외와 관련된 정보들로 인스턴스를 생성한다.
  2. 코드를 스캔하고 해당 지점이 try문으로 감싸졌는지를 확인
    1. try문이 없다면 해당 코드가 있는 메소드를 호출한 영역으로 예외를 전달하고 다시 try를 스캔
    2. try발견시 3번 단계를 이행하지만 없으면 반복
    3. main 메소드까지 호출되면 예외정보 출력(예외처리 없을 때 기본 동작) 후 프로그램 종료
  3. try문으로 감싸졌다면 catch문으로 인스턴스 참조값을 전달한다.
    • catch문의 e가 매개변수로서 참조값을 전달받는다.
  4. 예외처리 후, try문을 완전히 빠져나와서 후속코드 실행

 

try문으로 감싸는 영역의 기준

  • 예외 발생 후 처리가 완료되면 JVM은 try문 내부의 후속코드가 아닌 try문의 전체를 건너띄고 다음 코드를 실행함
  • 위와 같은 특성으로 인해서 try문으로 감싸는 영역의 기준은 "하나의 작업" 단위로 삼아야 함

 

Throwable 클래스

  • 모든 예외 클래스의 최상위 클래스
    • 단 이 클래스의 경우도 object 클래스를 상속함
  • 제공 메소드
    • public String getMessage()  -  예외 원인을 문자열로 반환
    • public void printStackTrace()  -  예외 발생 위치와 호출된 메소드 정보 반환 + 원인도 같이 알려줌
import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        
        try {
            System.out.print("a/b...a?");
            int n1 = kb.nextInt();
            System.out.print("a/b...b?");

            int n2 = kb.nextInt();
            System.out.printf("%d / %d = %d", n1, n2, n1/n2);
        }
        catch(ArithmeticException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        System.out.println("Good Bye!");
        kb.close();
    }
}
/****************실행결과****************/

a/b...a?10
a/b...b?0	--0으로 나눌 수 없음
/ by zero	--getMessage() 작동
java.lang.ArithmeticException: / by zero	--printStackTrace() 작동
        at test.main(test.java:13)
Good Bye!

 

'프로그래밍 > Java' 카테고리의 다른 글

Java - JVM의 메모리 모델과 Object 클래스  (0) 2020.07.23
Java - 예외처리 (2)  (0) 2020.07.17
Java - 인터페이스  (0) 2020.07.08
Java - 상속 (3)  (0) 2020.07.08
Java - 상속 (2)  (0) 2020.07.06