본문 바로가기
Back-End/Java

예외처리

by newny 2023. 1. 19.
반응형

예외와 예외 클래스

  • 에러(Error) : 컴퓨터 하드웨어의 고장으로 발생되는 응용프로그램 실행오류
  • 예외(Exception) : 잘못된 사용 또는 잘못된 코딩으로 인한 오류

 

자바는 예외가 발생하면 예외 클래스로부터 객체를 생성

Error, Exception : Throwable을 상속받음

예외클래스 : Throwable.Exception 상속받음

 

일반예외(Exception)

컴파일러가 예외처리 코드 여부를 검사O

예외처리 코드가 없다면 컴파일 오류를 발생시킴

 

실행예외(Runtime Exception)

컴파일러가 예외처리 코드 여부를 검사X

Exception.RuntimeException 클래스를 상속 받음

예외처리 코드가 없다면 오류발생 없이 컴파일 가능하나 실행도중 예외발생

 


예외처리 코드

예외가 발생했을 때 프로그램의 갑작스러운 종료를 막고 정상 실행을 유지할 수 있도록 처리하는 코드

try-catch-finally블록으로 구성되어 있음

생성자, 메소드 내부에서 작성됨

finally블록은 생략 가능

다중 catch블록 사용가능 (단, 윗쪽 catch블록보다 아랫쪽 catch블록이 예외처리범위가 더 커야함)

두개 이상의 예외를 하나의 catch블록으로 동일하게 처리하고싶을 때는 ‘| ‘사용

catch(NullPointerException | NumberFormatException e)

 

try블록에서 정상실행 → finally블록실행

try블록에서 예외 발생 → catch블록실행 → finally블록실행

 


리소스 자동 닫기

리소스 = 데이터를 제공하는 객체

close() 메소드 : 리소스를 사용하다가 예외가 발생 할 경우에도 안전하게 닫기 위해 사용

FileInputStream fis = null;
try {
  fis = new FileInputStream("file.txt");  //파일열기
  ...
} catch(IOException e) {
  ...
} finally {
  fis.close();
}

 

finally블록, close() 메소드 사용 없이 try-with-resource블록을 사용하면 위와 똑같이 안전하게 리소스를 닫을 수있음

단 리소스는 java.lang.AutoCloseable 인터페이스를 구현해서 AutoCloseable 인터페이스의 close() 메소드를 재정의 해야한다.

try(FileInputStream fis = new FileInputStream("file.txt")) {
  ...
} catch(IOException e) {
  ...
}

 

복수 개의 리소스를 사용할 때

try(
  FileInputStream fis1 = new FileInputStream("file.txt");
  FileInputStream fis2 = new FileInputStream("file.txt")
) {
  ...
} catch(IOException e) {
  ...
}

 

Java 9 이후부터는 외부 리소스 변수 사용가능

FileInputStream fis1 = new FileInputStream("file1.txt")
FileInputStream fis2 = new FileInputStream("file2.txt")

try(fis1; fis2) {
  ...
} catch(IOException e) {
  ...
}

 


예외 떠넘기기

throws 키워드

메소드를 호출 한 곳으로 예외를 떠넘김

해당 메소드에서 예외처리를 떠넘겼기때문에 이 메소드를 호출한 곳에서 예외처리를 해야함

public void method1() {
try{
  method2(); // 호출한 곳에서 예외처리
} catch(ClassNotFoundException e) {
  ...
}

public void methos2() throws ClassNotFoundException {
  ...
}

 

나열해야 할 예외 클래스가 많을 경우

리턴타입 메소드명(매개변수, …) throws Exception {}

 

main()메소드에서 throws 키워드를 사용하게되면 JVM이 최종적으로 예외처리를 하게됨

JVM은 예외의 내용을 콘솔에 출력하는 것으로 예외 처리를 함

public static void main(String[] args) throws Exception {}

 


사용자 정의 예외

직접 예외 클래스를 정의해서 사용

일반 예외, 실행 예외 둘다 선언 가능

기본 생성자와 예외 메세지를 입력받는 생성자를 생성해줘야함

public class XXXException extends Exception|RuntimeException {
  public XXXException() { //기본생성자
  }
  
  public XXXException(String message) { //예외 메세지를 입력받는 생성자
    super(message);
  }

 

예외 발생시키기

throw(s 안붙음 주의) 키워드와 함께 예외 객체를 제공하면됨

대부분은 메소드를 호출한 곳에서 예외를 처리하도록 throws 키워드로 예외를 넘김

void method() throws Exception {
  ...
  throw new Exception("예외 메세지");
  ...
}
반응형

'Back-End > Java' 카테고리의 다른 글

java.base 모듈  (0) 2023.01.19
라이브러리와 모듈  (0) 2023.01.19
인터페이스 - 01  (0) 2023.01.05

댓글