프로그램 오류 (에러)
•
프로그램 실행 중 오작동이 일어나거나, 비정상적 종료를 초래하는 원인
•
종류 (발생 시점에 따라)
◦
컴파일 에러 : 컴파일 시 발생
◦
런타임 에러 : 실행 시 발생
◦
논리적 에러 : 실행은 되지만, 의도와 다른 동작
•
소스 코드를 컴파일 하면 컴파일러가 소스코드(.java)에 대해
오타, 잘못된 구문, 자료형 체크 등 기본적인 검사를 수행하여 오류가 있는지 알림 → 컴파일 에러
◦
컴파일이 성공적으로 완료되면, 클래스 파일(.class)이 생성되고, 생성된 파일 실행 가능
•
컴파일이 잘 됐어도, 프로그램 실행 중 동작을 멈춘 상태가 오래 지속되거나, 갑자기 실행을 멈추고 종료되는 경우도 발생 → 런타임 에러
◦
런타임 에러 방지를 위해,
실행 중 에러가 발생할 수 있는 모든 경우의 수를 고려하여 대비가 필요!
•
프로그램 실행 시 발생하는 Java의 오류 종류
◦
에러(error)
▪
프로그램 코드에 의해 수습될 수 없는 심각한 오류
▪
메모리 부족(OutOfMemoryError), 스택오버플로우(StackOverflowError) 등
◦
예외(exception)
▪
프로그램 코드에 의해 수습할 수 있는 미약한 오류
예외 클래스의 계층 구조
•
Exception과 Error 클래스도 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 연산자를 이용해 검사
•
검사결과가 true인 catch 블럭을 만나면 블럭 내 문장들을 수행 후 종료
•
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블럭은 코드를 간단히 하는 수준에서만 사용하자!