람대리 2024. 5. 7. 14:14
728x90

프로그램 오류

- 컴파일할 때 발생하는 에러가 컴파일 에러입니다.

- 실행할 때 발생하는 에러가 런타임 에러입니다.

- 런타임 에러는 에러와 예외로 나눠집니다.

- 프로그램 코드에 의해서 해결할 수 없는 심각한 오류를 에러(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; 다시 예외를 발생시킵니다
        }
    } 
}

- 예외를 처리한 후에 다시 예외를 생성해서 호출한 메서드에게 전달합니다.

- 예외가 발생한 메서드와 호출한 메서드, 양 쪽에서 예외를 처리하는 경우에 사용됩니다.