1) 예외처리란? (Exception, Error Handling)
코드를 완벽하게 짰다고 해서 항상 프로그램이 성공적으로 도는 것은 아니다. 다양한 예외 상황이 발생할 수 있는데, 이것에 대응하기 위해서 예외 처리 코드가 필요하다.
Java는 JVM내의 Heap이라는 메모리 공간을 운영체제로부터 할당 받아 사용합니다. 할당 받을 수 있는 최대 메모리 이상을 사용하면, JVM이 다운될 수 밖에 없다.
이 경우 OutOfMemoryError가 나면서 프로그램이 종료된다. 자바의 대표적인 에러 상황으로 줄여서 OOM이라고도 한다.
2) try-catch(-finally) 형식
try {
// 예외가 발생할 가능성이 있는 코드를 구현합니다.
} catch (FileNotFoundException e) {
// FileNotFoundException이 발생했을 경우,이를 처리하기 위한 코드를 구현합니다.
} catch (IOException e) {
// FileNotFoundException이 아닌 IOException이 발생했을 경우,이를 처리하기 위한 코드를 구현합니다.
} finally {
// 예외의 발생여부에 관계없이 항상 수행되어야하는 코드를 구현합니다.
}
finally 구문은 필수는 아니다. 만약, 예외가 발생하지 않는다면 try -> finally 순으로 실행된다.
또한, 예외는 중복 catch 블럭을 사용하여 다양한 예외처리를 수행할 수 있다. 중복 catch블럭을 사용할 때는 먼저 선언된 catch블럭부터 확인한다. 앞의 catch블럭에서 잡혔다면, 뒤의 catch블럭으로는 전파되지 않는다. 좁은 범위의 예외부터 앞에 선언하는 것이 좋다. 여기서 좁은 범위란 상속관계에서 자식 클래스에 위치 할수록 좁은 범위이다. 예를 들어서 IOException이 발생할 것 같아 예외처리를 하고, 그 외의 예외도 예외처리를 하고 싶다면 IOException을 catch 하는 구문을 먼저, Exception 을 catch하는 구문을 그 뒤에 작성한다.
3) try-with-resource 형식
입출력과 함께 자주 쓰이는 구문이다.
일반적으로 사용되었던 자원을 끝난 후에 닫아줘야 하는 것들이 존재하는데 try-catch-finally구문보다 편리하다.
기존의 try-catch(-finally)문은 자원을 닫을 때 close()를 사용해야 한다.
try-with-resource문은 try문을 벗어나는 순간 자동적으로 close()가 호출된다.
try()안의 입출력 스트림을 생성하는 로직을 작성할 때 해당 객체가 AutoClosable 인터페이스를 구현한 객체여야 합니다.
AutoClosable 인터페이스
그럼 왜 AutoClosable 인터페이스를 사용해야할까요??바로 AutoClosable 인터페이스에는 예외가 발생할 경우 close()메소드를 호출하기로 정의되어있기 때문입니다.
4) 메소드에서의 예외 선언
void method() throws IndexOutOfBoundsException, IllegalArgumentException {
//메소드의 내용
}
이처럼, 키워드 throws를 사용해서 메소드 내에서 발생할 수 있는 예외를 적어주면 된다!