Back-end/Java

다시 하자 기초! 예외처리

이안_ian 2019. 4. 21. 13:32
반응형

프로그램 오류

프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우가 있다. 이를 프로그램 에러 또는  오류라고 한다. 이를 발생시점에 따라 '컴파일 에러'와 '런타임 에러'로 나눌 수 있다. 그리고 실행은 잘 되지만 창고의 재고가 음수가 된다던가, 게임에서 비행기가 총알을 맞아도 죽지 않는 경우가 있다.

 

컴파일 에러 - 컴파일 시에 발생하는 에러

런타임 에러 - 실행 시에 발생하는 에러

논리적 에러 - 실행은 되지만, 의도와 다르게 동작하는 것

 

런타임 에러에서 발생 되는 오류를 크게 2가지로 생각 할 수 있다.

메모리 부족이나 스택오버플로우와 같은 일단 발생하면 복수할 수 없는 심각한 것을 에러라고 하며

발생하더라도 수습될 수 있는 비교적 덜 심각한 것은 예외라고 표현한다.

 

다시 이 예외는 2가지로 나뉠 수 있다.

Exception 클래스 - 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외

RuntimeException 클래스 - 프로그래머의 실수로 발생하는 예외

 

try-catch 문의 흐름

1. try블럭 내에서 예외가 발생한 경우,

-발생한 예외와 일치하는 catch블럭이 있는지 확인한다.

-일치하는 catch블럭을 찾게 되면, 그 catch블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져 나와서 그 다음 문장을 계속해서 수행한다. 만일 일치하는 catch블럭을 찾지 못하면, 예외는 처리되지 못한다.

 

2.try블럭 내에서 예외가 발생하지 않는 경우

-catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속한다.

 

printStackTrace() - 예외발생 당시의 호출 스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.

 

getMessage() - 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.

 

finally블럭

try-catch문과 함께 예외의 발생여부에 상관없이 항상 실행되어야 할 코드를 포함시킬 목적으로 사용된다.

예외가 발생한 경우 try -> catch -> finally

예외가 발생 안한 경우 try -> finally

 

자동 자원 반환 try - with - resources문

입출력과 관련된 자원을 사용하고 난뒤에는 반드시 닫아줘야한다. 그래서 보통 finally에 close문을 추가해주는데 문제는 이 close또한 try-catch처리를 해줘야 하기에 코드가 더 복잡해지고 보기 안좋다. 그래서 자동으로 close를 호출해서 자원을 반환하도록 하는 것을 쓰는것이다. 방식은 아래와 같다.

try(FileInputStream fis = new FileInputStream("score.dat");
    DataInputStream dis = new DataInputStream(fis)) {
    ...
    }
   catch(Exception e){
   ...
   }

이렇게 try ( ) 안에 객체를 생성하면 try문을 벗어나는 순간 자동적으로 close()가 호출된다.

 

 

 

 

 

 

반응형