예외란?
에러(error)가 아닌, 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 오류.
* 에러
하드웨어의 오동작, 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것.
예외와 에러가 발생하면 프로그램을 곧바로 종료된다.
그러나 예외는 예외 처리(Exeception Handling)를 통해 종료 시키지 않고 정상 실행 상태를 유지시킬 수 있다.
예외의 종류
일반 예외 (Exeception) = 컴파일러 체크 예외 : 자바 소스 컴파일 과정에서 예외 처리 코드가 필요한지 검사하는 예외. 예외처리가 필요하다고 컴파일러가 알려준다.
실행 예외 (Runtime Exeception) : 컴파일 과정에서 예외 처리 코드를 검사하지 않는 예외. 개발자의 경험을 바탕으로 예외 처리를 해줘야한다.
예외 처리
자바는 예외를 클래스로 관리한다. JVM은 예외가 발생하면 해당 예외 클래스로 객체를 생성한다. 그리고 예외 처리 코드에서 예외 객체를 이용할 수 있도록 해준다.
모든 예외 클래스들은 java.lang.Exeception 클래스를 상속받는다.
실행 예외들은 java.lang.Exeception 밑의 RuntimeExeception을 상속받는다.
예외 처리 코드
프로그램에서 예외가 발생했을 경우 프로그램의 갑작스러운 종료를 막고, 정상 실행을 유지할 수 있도록 처리하는 코드.
try-catch-finally 블록을 작성하면 된다. finally 블록은 생략 가능하다.
try {
//예외 발생 가능 코드
} catch( 예외클래스 e ) {
//예외 처리
} finally {
//항상 실행될 실행문
}
try 블록의 코드가 예외를 발생시키지 않고 정상 실행된다면 catch 블록의 코드는 실행되지 않고 바로 finally 블록으로 넘어간다.
'예외가 발생하면 즉시 catch 블록으로 이동하여 예외 처리 코드를 실행하고 finally 블록의 코드를 실행한다.
try 블록과 catch 블록에서 return문을 사용하더라도 finally 블록은 항상 실행된다.
다중 catch
try 블록에서 여러 종류의 예외가 발생할 것 같고, 이 예외마다 처리를 다르게 해주려면 다중 catch 블록을 작성한다.
try {
} catch(NumberFormatException e) {
} catch(ArrayIndexOutOfBoundsException e) {
}
- catch 블록이 여러 개여도, try 블록에서 하나의 예외가 발생하는 즉시 실행이 멈추고 catch 블록으로 이동하기 때문에 여러 예외처리가 실행되진 않는다.
- 항상 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 한다. 상위 예외 클래스의 catch 블록이 위에 있다면, 하위 예외 클래스의 catch 블록은 실행되지 않기 때문이다.
멀티 catch
try 블록에서 여러 종류의 예외가 발생할 것 같고, 이 예외들의 처리를 같게 해주려면 멀티 catch 블록을 작성한다.
즉, 하나의 catch 블록에서 여러 개의 예외를 처리 할 수 있다.
try {
} catch(NumberFormatException | ArrayIndexOutOfBoundsException e) {
}
자동 리소스 닫기
try-with-resources를 사용하면 예외 발생 여부와 상관없이 사용했던 리소스 객체의 close() 메소드를 호출해서 안전하게 리소스를 닫아준다.
try( 리소스 ) 를 써주면 된다.
try(
FileInputStream fis = new FileInputStream("file1.txt");
FileOutputStream fos = new FileOutputStream("file2.txt");
) {
...
} catch (IOExeception e) {
...
}
try-with-resources를 사용하려면, 리소스 객체가 java.lang.AutoCloseable 인터페이스를 구현하고 있어야 한다.
예외 떠넘기기
메소드 내부에 예외가 발생할 수 있는 코드를 작성할 때, 메소드를 호출한 곳으로 예외를 떠넘길 수도 있다.
throws 키워드를 메소드 선언부 끝에 작성하면, 메소드 내부에서 처리하지 않은 예외를 호출한 곳으로 떠넘긴다.
throws 키워드가 붙은 메소드는 반드시 try 블록 내에서 호출되어야 하고, 떠넘겨진 예외를 catch 블록에서 반드시 처리해야 한다.
리턴타입 메소드명(매개변수, ...) throws 예외클래스1, 예외클래스2, ... {
}
다음과 같이 throws Exeception 으로 모든 예외를 떠넘길 수도 있다.
리턴타입 메소드명(매개변수, ...) throws Exeception {
}
'old > Java' 카테고리의 다른 글
사용자 정의 예외와 예외 발생시키기, 예외 정보 얻기 (0) | 2020.11.15 |
---|---|
Java 예외(exeception) 종류 (일부) (0) | 2020.11.15 |
익명 객체 (anonymous) (0) | 2020.11.15 |
중첩 클래스와 중첩 인터페이스 (nested) (0) | 2020.11.15 |
인터페이스(interface) (0) | 2020.11.15 |