이 다음에도 강의가 이렇게 길지는 모르겠는데 지금까지 중에선 제일 길어서 나눠서 정리해야겠다.
예외처리의 기본
- 예외란? - 사용자가 개발자의 예상과 다른 조작 또는 행동으로 인해서 생기는 상황으로 문법적인 오류가 아님
- 예외처리란? - 위와 같이 정의된 예외가 발생한 상황에 대한 처리
- 자바의 기본 예외처리
- 예외가 발생한 지점과 발생한 예외에 대한 정보 안내
- 프로그램 종료
- 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();
}
}
자바의 예외처리
- 예외가 발생했을 때 해당 예외와 관련된 정보들로 인스턴스를 생성한다.
- 코드를 스캔하고 해당 지점이 try문으로 감싸졌는지를 확인
- try문이 없다면 해당 코드가 있는 메소드를 호출한 영역으로 예외를 전달하고 다시 try를 스캔
- try발견시 3번 단계를 이행하지만 없으면 반복
- main 메소드까지 호출되면 예외정보 출력(예외처리 없을 때 기본 동작) 후 프로그램 종료
- try문으로 감싸졌다면 catch문으로 인스턴스 참조값을 전달한다.
- catch문의 e가 매개변수로서 참조값을 전달받는다.
- 예외처리 후, 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 |