[JAVA] 예외처리

Posted by 신희준 on August 25, 2017


2017 - 08 - 25 (금)

  • 예외처리

  • 참고 도서 : 자바의 정석(남궁성 저, 도우출판)


    1 . 예외처리


    프로그램 오류

    - 컴파일 에러 : 컴파일할 때 발생하는 에러

    - 런타임 에러 : 실행할 때 발생하는 에러. ( 에러와 예외가 있다. )

    에러 : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
    예외 : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류


    >>예외는 반드시 처리해야 한다.

    예외 처리 : 프로그램 실행 시 발생할 수 있는 예외를 미리 방지하는 코드를 작성하는 것.

    try-catch문 : try 안의 내용이 에러면 catch 블럭 안의 문장을 실행시킨다.

    try{
    	System.out.println("1"); //try문에 에러가 없다.
    }catch(Exception e){  //모든 예외를 포괄적으로 Exception으로 처리
     	System.out.println("2"); //실행되지 않는다.
    }
    try{
    	System.out.println(0/0)   // 0/0은 논리적 예외다.
    }catch(ErithmeticException ae){   // ErithmeticException은 위와같은 논리적 예외를 잡아낸다.
    	System.out.println("예외발생")
    }
    try{
    	Exception e = new Exception("예외");
    	throw e;    //예외를 고의로 발생시킴
    }catch(Exception e){
    	e.printStackTrace(); //예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메세지를 화면에 출력한다.
    }
    


    finally 블럭 : 예외 발생여부와 관계없이 실행되어야 하는 코드를 넣는다.

    try{
    	Exception e = new Exception("예외");
    	throw e;    //고의 예외발생
    }catch(Exception e){
    	e.printStackTrace();
    }finally{  
    	System.out.println("finally 블록 실행"); //예외의 유무에 관계없이 마지막에 실행시킨다.
    }
    


    >> 예외 종류
    Post Sample Image



    Exception 예제

    
    public class NewExceptionTest {
    	public static void main(String args[]) {
    		try {
    			startInstall();
    			copyFiles();
    		}/*catch(SpaceException e) {
    			System.out.println("에러 메시지: "+ e.getMessage());
    			e.printStackTrace();
    			System.out.println("공간을 확보한 후에 다시 설치하시기바랍니다.");*/
    		catch(MemoryException me) {
    			System.out.println("에러메시지: "+ me.getMessage());
    			me.printStackTrace();
    			System.gc();
    			System.out.println("다시 설치를 시도하세요.");  //MemoryException에 대한 예외가 발생한다.
    		}catch(ArithmeticException e){
    			System.out.println("여기서 에러남");  //이 예외는 발생하지 않는다.
    		}finally {
    		}
    			deleteTempFiles(); //catch문이 끝나면 다음 문장을 무조건 실행한다.
    		}
    
    	static void startInstall() throws ArithmeticException,MemoryException{
    		/*if(!enoughSpace())
    			throw new SpaceException("설치할 공간이 부족합니다.");*/
    //		int i = 1/0;
    		if(!enoughMemory())
    			throw new MemoryException("메모리가 부족합니다.");
    
    	}
    	static void copyFiles() {}
    	static void deleteTempFiles(){}
    	static boolean enoughSpace() {
    		return false;
    	}
    	static boolean enoughMemory() {
    		return false;
    	}
    
    }
    class SpaceException extends Exception{
    	SpaceException(String msg){
    		super(msg);
    	}
    }
    class MemoryException extends Exception{
    	MemoryException(String msg){
    		super(msg);
    	}
    }
    



    사실상 위의 예외들을 전부 Exception으로 처리할 수 있다. 하위 Exception들을 사용하는 이유는 좀더 세부적인 예외처리를 위해서이다. 다양한 예외 상황에 대비할 수 있다.