다시 하자 기초! 예외처리
프로그램 오류
프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우가 있다. 이를 프로그램 에러 또는 오류라고 한다. 이를 발생시점에 따라 '컴파일 에러'와 '런타임 에러'로 나눌 수 있다. 그리고 실행은 잘 되지만 창고의 재고가 음수가 된다던가, 게임에서 비행기가 총알을 맞아도 죽지 않는 경우가 있다.
컴파일 에러 - 컴파일 시에 발생하는 에러
런타임 에러 - 실행 시에 발생하는 에러
논리적 에러 - 실행은 되지만, 의도와 다르게 동작하는 것
런타임 에러에서 발생 되는 오류를 크게 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()가 호출된다.