05/07 18일차 객체지향언어II : 예외처리
프로그램 오류
- 컴파일할 때 발생하는 에러가 컴파일 에러입니다.
- 실행할 때 발생하는 에러가 런타임 에러입니다.
- 런타임 에러는 에러와 예외로 나눠집니다.
- 프로그램 코드에 의해서 해결할 수 없는 심각한 오류를 에러(error)라고 부릅니다.
- 프로그램 코드에 의해서 해결가능한 오류를 예외(Exception)라고 부릅니다.
예외처리란?
- 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것입니다. (정의)
- 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것입니다. (목표)
try-catch문에서의 흐름
class Exception{
public static void main(String[] args){
System.out.println(1);
System.out.println(2);
try{
System.out.println(3);
System.out.println(4);
}catch(Exception e){
System.out.println(5);
}
System.out.println(6);
}
}
// 실행결과 : 1 2 3 4 6
class Exception{
public static void main(String[] args){
System.out.println(1);
System.out.println(2);
try{
System.out.println(3);
System.out.println(0/0);
System.out.println(4);
}catch(ArithmeticException ae){
System.out.println(5);
}
System.out.println(6);
}
}
//실행결과: 1 2 3 5 6
- 발생하는 예외와 일치하는 catch블록이 있는지 확인합니다.
- 일치하는 catch 블록을 찾게 된다면, 블록내에 문장들을 수행하고 전체 try-catch문을 빠져나갑니다.
- 만일 일치하는 catch 블록을 찾지 못한다면, 예외는 처리되지 못합니다. try-catch문을 빠져나가 수행을 계속합니다.
예외 발생시키기
class Exception{
public static void main(String[] args){
try{
Exception e = new Exception("고의로 발생시켰음");
throw e;
} catch(Exception e){
System.out.println("msg: "+e.getMessage());
}
System.out.println("프로그램이 정상 종료되었습니다");
}
}
- 연산자 new를 이용해서 발생시키려는 예외 클래스 객체를 만든 다음
- 키워드 throw를 이용하여 예외를 발생시킵니다.
finally 블록
class FinallyTest{
public static void main(String[] args){
try{
startInstall();
copyFiles();
} catch(Exception e){
e.printStackTrace();
}finally{
deleteTempFiles();
}
}
}
- 예외의 발생과 상관없이 실행되어야 할 코드를 적습니다.
- 예외 발생시, try-catch-finally 순으로 실행됩니다.
- 예외 미발생시, try-finally 순으로 실행됩니다.
메서드에 예외 선언하기
- 예외를 처리하는 것이 아니라 호출한 메서드로 전달합니다.
- 호출한 메서드에서 예외처리를 해야만 할때 사용합니다.
class Exception{
public static void main(String[] args) throws Exception{
method1();
}
static void method1() throws Exception{
method2();
}
static vodi method2() throws Exception{
throw new Exception();
}
}
- 예외가 발생한 곳은 제일 윗줄 method2()입니다.
- method2()는 method1()에게 예외처리를 요청했으며, method1()은 main에게 예외처리를 요청하였습니다.
예외 되던지기(re-throwing)
class Exception{
public static void main(String[] args){
try{
method1();
} catch(Exception e){
System.out.println("main메서드에서 예외가 처리되었습니다");
}
}
static void method1() throws Exception{
try{
throw new Exception();
}catch(Exception e){
System.out.println("메서드1에서 예외가 처리되었습니다");
throw e; 다시 예외를 발생시킵니다
}
}
}
- 예외를 처리한 후에 다시 예외를 생성해서 호출한 메서드에게 전달합니다.
- 예외가 발생한 메서드와 호출한 메서드, 양 쪽에서 예외를 처리하는 경우에 사용됩니다.