WEB/Back-end
예외 (Java)
by 최새벽
2024. 7. 13.
예외 처리
예외
- 에러: 하드웨어 고장으로 응용프로그램 실행 오류가 발생하는 것 → 대처 불가능
- 예외: 잘못된 사용 또는 코딩으로 발생하는 오류
- 예외는 에러와 달리 계속 실행 상태를 유지할 수 있음
- 일반 예외: 컴파일러가 예외 처리 코드 여부 검사하는 예외
- ClassNotFoundException, InterruptedException, ...
- 실행 예외: 컴파일러가 예외 처리 코드 여부를 검사하지 않는 예외
- RuntimeException ⊃ NullPointerException, ArrayIndexOutOfBoundsException, NumberFormatException
예외 처리
- 갑작스러운 종료를 막고 정상 실행을 유지할 수 있게 처리하는 코드
- try-catch구문
- catch에서 지정한 예외 클래스만 처리해주므로 여러 예외를 처리하려면 catch구문을 여러 개 사용해야 함
- 단, 지정한 예외 중 여러가지가 발생된다면 예외 중 try문 가장 위에 있는 예외의 catch구문만 실행됨
- catch구문을 여러 개 작성하는 거라면 가장 좁은 범위의 예외부터 적어야 함
- 다중 catch
try{
예외 발생 코드
...
} catch(예외클래스 e){
예외 처리1
System.out.println(e.getMessage());
} catch(예외클래스 e){
예외 처리2
} finally{
항상 실행
}
- Exception을 사용하면 모든 예외에 대한 처리가 가능함
e.getMessage()
: 어떠한 예외가 발생했는지 확인할 수 있음
e.printStackTrace();
: 발생한 예외 출력(프로그램이 종료되지 않고 예외 메시지가 출력)
try{
예외 발생 코드
...
} catch(Exception e){
예외 처리
} finally{
항상 실행
}
리소스 닫기
- 리소스: 자원, 데이터를 제공하는 객체
- 사용하기 위해서 열어야(open, connect) 하며, 사용 후 닫아야(close) 함
- 예외 발생 시에도 안전하게 닫는 것이 중요함
try-with-resources
블록을 사용하면 예외 발생 여부와 상관없이 리소스를 자동으로 닫아줌
finally
에서 close하기
FileInputStream fis = null;
try{
fis = new FileInputStream("file.txt");
...
} catch(IOException e){
예외 처리
} finally{
fis.close();
}
try-with-resources
블록 사용하기. (단, 조건: AutoCloseable 인터페이스에서 close() 메서드를 재정의해야함)
public class FileInputStream implements AutoCloseable{
...
@Override
public void close() throws Exception{
...
}
}
try(FileInputStream fis1 = new FileInputStream("file.txt")){
...
} catch(IOException e){
//예외 처리
}
예외 떠넘기기
사용자 정의 예외 클래스
- 표준 라이브러리에 없어 직접 정의하는 예외 클래스
- 보통 Exception의 자식 클래스로 선언
예외 강제로 발생시키기
- throw 키워드와 함께 예외 객체 제공
- 예외 상속을 통한 정의
public class TestException extends Exception{
public TestException (String msg) {
super(msg);
}
}
- main 메서드 클래스 코드
public class ExceptionEx {
public static void main(String[] args) {
System.out.println("시작");
int[] arr = { 1, 2, 3 };
try {
throw new TestException("내가 만든 예외");
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("항상 실행");
}
System.out.println("끝");
}
}
- 실행 결과
시작
항상 실행
끝
ch11.TestException: 내가 만든 예외 at ch11.ExceptionEx.main(ExceptionEx.java:11)