Search

예외 처리 1

프로그램 오류 (에러)

프로그램 실행 중 오작동이 일어나거나, 비정상적 종료를 초래하는 원인
종류 (발생 시점에 따라)
컴파일 에러 : 컴파일 시 발생
런타임 에러 : 실행 시 발생
논리적 에러 : 실행은 되지만, 의도와 다른 동작
소스 코드를 컴파일 하면 컴파일러가 소스코드(.java)에 대해 오타, 잘못된 구문, 자료형 체크 등 기본적인 검사를 수행하여 오류가 있는지 알림 → 컴파일 에러
컴파일이 성공적으로 완료되면, 클래스 파일(.class)이 생성되고, 생성된 파일 실행 가능
컴파일이 잘 됐어도, 프로그램 실행 중 동작을 멈춘 상태가 오래 지속되거나, 갑자기 실행을 멈추고 종료되는 경우도 발생 → 런타임 에러
런타임 에러 방지를 위해, 실행 중 에러가 발생할 수 있는 모든 경우의 수를 고려하여 대비가 필요!
프로그램 실행 시 발생하는 Java의 오류 종류
에러(error)
프로그램 코드에 의해 수습될 수 없는 심각한 오류
메모리 부족(OutOfMemoryError), 스택오버플로우(StackOverflowError)
예외(exception)
프로그램 코드에 의해 수습할 수 있는 미약한 오류

예외 클래스의 계층 구조

ExceptionError 클래스도 Object 클래스의 자손
모든 예외의 최고 조상은 Exception 클래스
예외 클래스는 크게 다음과 같이 그룹화 가능
Exception 클래스와 그 자손들
주로 외적인 요인(프로그램 사용자의 실수)에 의해 발생하는 예외
RuntimeException 클래스와 그 자손들
주로 프로그래머의 실수에 의해 발생할 수 있는 예외

예외 처리하기 - try-catch문

예외 처리(Exception Handling)
정의 : 프로그림 실행 시 발생할 수 있는 예외에 대비한 코드를 작성하는 것
목적 : 프로그램의 비정상적 종료를 막고, 정상적인 실행 상태를 유지
예외가 처리되지 않으면, 프로그램은 비정상적 종료되며, JVM예외처리기(UncaughtExceptionHanlder)가 받아서 예외의 원인을 화면에 출력
예외 처리를 위해 try-catch문 사용
try { // 예외 발생 가능성이 있는 문장들 } catch (Exception1 e1) { // Exception1 발생 시, 처리를 위한 문장 } catch (Exception2 e2) { // Exception2 발생 시, 처리를 위한 문장 } catch (ExceptionN eN) { // ExceptionN 발생 시, 처리를 위한 문장 }
Java
발생한 예외 종류와 일치하는 단 하나의 catch 블럭만 수행되며, 일치하는 블럭이 없다면 예외는 처리되지 않음.
하나의 메소드에 여러 try-catch문 사용이 가능, try 또는 catch 블럭 안에 또 다른 try-catch문 사용 가능
ExceptionEx1.java
100을 0~9사이의 임의의 정수로 나눈 결과 출력을 10번 반복하는 예제
ExceptionEx2.java

try-catch문에서의 흐름

try 블럭 내에서 예외가 발생한 경우
1.
발생한 예외와 일치하는 catch 블럭이 있는지 확인
2.
일치하는 catch 블럭 내 문장을 수행한 뒤, try-catch문을 빠져나가 다음 문장을 계속 수행 (일치하는 catch 블럭이 없다면 예외는 처리 되지 않음)
try 블럭 내에에서 예외가 발생하지 않은 경우
1.
catch 블럭을 거치지 않고, try-catch문을 빠져나가서 수행 계속
예외가 발생하지 않으면, catch 블럭 내 문장은 실행되지 않음.
ExceptionEx3.java
예외가 발생하는 경우
ExceptionEx4.java

예외 발생과 catch 블럭

첫 번째 catch 블럭부터 차례로 ( ) 안에 선언된 참조변수의 종류와 생성된 예외 클래스의 인스턴스를 instanceof 연산자를 이용해 검사
검사결과가 truecatch 블럭을 만나면 블럭 내 문장들을 수행 후 종료
true인 블럭이 없으면 예외는 처리되지 않음.
ExceptionEx5.java
마지막 catch문에 Exception 클래스 타입의 참조변수를 사용하여 예상치 못한 어떤 종류의 예외가 발생하더라도 처리되도록 하기
ExceptionEx6.java

printStackTrace()와 getMessage()

printSTackTrace()
예외 발생 당시의 호출 스택(Call Stack)에 있었던 메소드의 정보와 예외 메세지를 출력
getMessage()
발생한 예외 클래스의 인스턴스에 저장된 메세지를 얻을 수 있음
ExceptionEx7.java

멀티 catch 블럭

JDK 1.7부터 catch 블럭을 | 기호를 이용해서 하나의 catch 블럭으로 병합 가능
try { ... } catch (Exception A | ExceptionB e { e.printStackTrace(); }
Java
| 로 연결된 예외 클래스가 서로 조상과 자손 관계면 컴파일 에러 발생
두 개 다 써줄 필요 없이 조상 예외 클래스만 써주면 됨!
멀티 처리를 했을 떈, 여러 예외 중 예외가 발생헀는지 알긴 어려움.
참조변수 e로 연결된 클래스 중 조상 예외 클래스에 선언된 멤버만 사용 가능
try { ... } catch (ExceptionA | ExceptionB e { e.methodA(); // 에러. ExceptionA에 선언된 methodA()는 호출 불가 if (e instanceof ExceptionA) { ExceptionA e1 = (ExceptionA)e; e1.methodA(); // ExceptionA에 선언된 메소드 호출 가능 } else { // if (e instanceof Exception B) ... } e.printStackTrace(); }
Java
근데 굳이 병합해서 위와 같은 수고로움을 겪을 필욘...
멀티 catch블럭은 코드를 간단히 하는 수준에서만 사용하자!

참고 자료