1. 예외(Exception)
what?
프로그램 실행 중에 발생하는 오류 중 조치를 취할 수 있는 수준의 오류
오류의 종류
에러: 개발자가 조치를 취할 수 없는 수준(메모리 부족, JVM 동작 이상)
컴파일 에러: 컴파일시 발생하는 에러(오타, 잘못된 데이터타입 등)
런타임 에러: 프로그램 실행 중 발생하는 에러
로직 에러: 실행은 되지만 의도와 다르게 동작하는 에러
예외: 다른 방식으로 처리 가능한 오류(입력 값 오류, 네트워크 문제 등)
2. 예외 처리(Exception Handling)
what?
예외가 발생했을 경우 이를 처리해 프로그램이 비정상적으로 종료되는 것을 막는 것
why?
입력 값이 잘못되는 등의 사소한 오류가 발생했을 때 적절히 처리해서 프로그램을 계속 실행시키기 위함
how?
1)try-catch문
try문: 예외가 발생할 수 있는 문장
catch문: 예외 발생시 처리 방법
try{
int[] a = {2, 0};
int b = 4;
int c = b/a[2]
}catch(ArithmeticException e){//수를 0으로 나눌 경우 발생하는 오류
System.out.println("산술 오류 발생");
}catch(ArrayIndexOutOfBoundsException e){//배열 인덱스가 잘못됐을 경우 발생하는 오류
System.out.println("배열 길이 오류 발생");
}
//오류가 발생하면 해당 오류를 파라미터로 가지는 catch문 실행
2)finally문
선택적으로 추가
try문 내의 오류 발생 여부에 관계없이 반드시 실행됨(≒if문의 else)
int a = 0;
int b = 2;
try{
System.out.println("외부로 접속");
int c = b/a;
}catch(ArithmeticException e){
System.out.println("오류 발생");
}finally{
System.out.println("연결 해제");
}
3. 객체로서의 예외
1)객체지향 언어인 자바는 예외도 객체로 다룸
상속 관계
Object <- Exception <- 각종 예외 클래스
위에서 사용한 예제에서,
try{
int[] a = {2, 0};
int b = 4;
int c = b/a[2]
}catch(ArithmeticException e){//수를 0으로 나눌 경우 발생하는 오류
System.out.println("산술 오류 발생");
}catch(ArrayIndexOutOfBoundsException e){//배열 인덱스가 잘못됐을 경우 발생하는 오류
System.out.println("배열 길이 오류 발생");
}
//오류가 발생하면 해당 오류를 파라미터로 가지는 catch문 실행
catch문을 모든 예외의 부모인 Exception 클래스로 한 번에 처리할 수도 있다.
try{
int[] a = {2, 0};
int b = 4;
int c = b/a[2]
}catch(Exception e){
System.out.println("오류 한번에 처리");
}
2)Exception의 메서드
(1)getMessage(): 예외에 대한 설명 반환
try {
// 예외 발생 가능한 코드
} catch (Exception e) {
String message = e.getMessage(); // 예외에 대한 설명을 얻음
System.out.println("예외 메시지: " + message);
}
(2)toString(): 예외 객체를 문자열로 변환하여 반환
try {
// 예외 발생 가능한 코드
} catch (Exception e) {
String exceptionString = e.toString(); // 예외 객체를 문자열로 변환
System.out.println("예외 정보: " + exceptionString);
}
(3)printStackTrace(): 예외의 발생 경로를 추적하고 예외 정보를 출력. 주로 디버깅 목적으로 사용된다.
try {
// 예외 발생 가능한 코드
} catch (Exception e) {
e.printStackTrace(); // 예외의 발생 경로를 출력
}
(4) getCause(): 예외의 원인이 되는 다른 예외를 반환한다. 다른 예외가 원인으로 작용한 경우 사용된다.
4. throw
what?
예외를 고의로 발생시키는 명령어
why?
문법상 문제되지 않지만 프로그램의 목적상 예외로 처리해야 하는 경우에 사용한다.
how?
try{
Exception e = new Exception("고의 예외");
throw e;
}catch(Exception e){
System.out.println("예외 발생");
System.out.println(e.getMessage());
}
5. throws(예외 던지기)
what?
예외가 발생했을 경우 현재 메서드가 처리하지 않고 자신을 호출한 쪽에서 처리하게 하는 것
why?
한 메서드 혹은 객체에서 많은 메서드 또는 객체를 호출할 경우, 모든 메서드/객체에서 일일히 예외를 처리하는 것보다 호출하는 곳 하나에서 처리하는 것이 훨씬 더 효율적이다.
how?
선언부에 throws 사용
void method() throws Exception{
}
예외 여러 개 처리할 경우 쉼표 뒤에 추가
다중 throws
함수 A()가 함수 B()를 호출하고 함수 B()가 함수 C()를 호출할 때, B()와 C()가 모두 예외 던지기를 사용한다고 가정한다. 이 경우 C()가 던진 예외는 B()로 가고, B()가 던진 예외는 A()로 가기 때문에 최종적으로는 A()가 예외를 처리하게 된다.
6. 사용자 정의 예외
개발자가 직접 정의해서 사용하는 예외
//Exception 클래스를 상속하는 새로운 예외 클래스
class AgeException extends Exception{
public AgeException(){}
public AgeException(String message){
super(message);
}
}
public class ExceptionExample{
public static void ticketing(int age) throws AgeException{
if(age<0){
throw new AgeException("잘못된 나이입니다.");
}
}
public static void main(String[] args){
int age = -19;
try{
ticketing(age);
}catch(AgeException e){
e.printStackTrace(e);
}
}
}