오류와 예외 클래스try-catch문try-catch-finally문try-with-resource : try(obj){..}예외 처리 미루기(throws)예외 여러개 발생할 경우CheckedException 과 UncheckedExceptionChecked ExceptionUnchecked ExceptionUse Case커스텀 예외 사용Chained Exception
오류와 예외 클래스

- 시스템 오류(error): 가상머신(JVM레벨)에서 발생. 프로그래머가 처리할 수 없는 오류
- 동적 메모리가 없는 경우(OutOfMemoryError), 스택 메모리 오버플로우(StackOverFlowError)
- 예외(Exception) : 프로그램에서 제어할 수 있는 오류. 비정상적인 종료를 막을 수 있음
- 읽어들이려는 파일이 존재하지 않거나 네트웍이나 DB연결이 안되는 경우
try-catch문
try-catch-finally문
- finally 블럭에서 파일을 닫거나 네트웍을 닫는 등의 리소스 해제 구현을 함
try-with-resource : try(obj){..}
- try(obj){ ...} 이런식으로 사용해야함. 여기서 obj는 리소스 변수
- AutoCloseable interface로 구현이 되어 있으면 close()하지 않아도 자동으로 해제가 됨
public class AutoCloseTest { public static void main(String[] args) { AutoCloseObj obj = new AutoCloseObj(); try (obj){ throw new Exception(); }catch(Exception e) { System.out.println("예외 부분 입니다"); } } }
예외 처리 미루기(throws)
- method에서 어떤 에러가 생길 수 있는 경우 throws를 사용하여 그 method를 사용하는 맥락에서 에러처리를 하도록 함
public class ThrowsException { public Class loadClass(String fileName, String className) throws FileNotFoundException, ClassNotFoundException{ FileInputStream fis = new FileInputStream(fileName); //FileNotFoundException 발생 Class c = Class.forName(className); //ClassNotFoundException 발생 return c; } public static void main(String[] args) { ThrowsException test = new ThrowsException(); try { test.loadClass("a.txt", "java.lang.String"); }catch (FileNotFoundException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }catch (Exception e) { e.printStackTrace(); } } }
예외 여러개 발생할 경우
catch (FileNotFoundException | ClassNotFoundException e)
CheckedException 과 UncheckedException
- 두 Exception을 사용하는 가이드라인 : 클라이언트가 사용하는 클래스의 해당 exception으로 부터 어떻게 회복해야 할지를 명확하게 알 수 있다면 CheckedException. 클라이언트가 사용하는 클래스의 해당 exception으로 부터 회복하기 위해 어떠한 것도 할 수 없는 상황이면 UncheckedException을 사용하기
- 참고! CheckedException과 UncheckedException을 Transaction이랑 묶는 개념 정리가 많이 떠돌아 다니는데 이 둘은 묶이는 것이 아님! (당연히 아닌건데.. ㅋ)

Checked Exception
- CheckedException을 사용할 때 try catch 혹은 throws를 통해 발생할 수 있는 예외를 명시해주는 것이 중요한 이유는 그 메서드를 부르는 사람이 그 메소드가 발생시킬 수 있는 에러에 대해서 알고 있어야 하기 때문임
- 컴파일 시점에서 확인될 수 있는 예외. 만약 코드 내에서 Checked Exception을 발생시키면, 해당 예외는 반드시 처리되거나, 해당 코드가 속한 메서드의 선언부에 예외를 선언해 주어야 함
public class ExceptionDemo{ public static void main(String[] args) { methodA(); } static void methodA(){ // throws IOException{ 이렇게 명시해주어야 함 throw new IOException(); // 컴파일 안됨 } }
Unchecked Exception
- 컴파일 단계에서는 확인되지 않는 예외. RuntimeException과 그 하위 클래스, 그리고 Error와 그 하위 클래스가 포함됨
- UncheckedException 중 RuntimeException은 코딩에서의 문제로 인한 결과임(개발자의 부주의로 인한 오류). 그래서 그 클래스를 사용하는 client code는 어떻게 거기서부터 회복해야 할지 알지 못함
- RuntimeException에 또한 try catch를 매번 붙이는 작업은 코드의 명료성을 떨어뜨림(← 어디에서나 발생할 수 있기 때문에). 그래서 UncheckedException에서는 try catch를 항상 적용할 필요가 없는 것
Use Case
- UncheckedException 은 try catch로 일일히 잡아줄 필요 없이, Exception이 발생한 그 지점으로부터 제일 상단에서만 try catch 구문을 적용해주면 됨. 모든 call 지점마다 다 try catch 적용할 필요가 없음
- CheckedException은 try catch로 일일히 잡아주어야 함 → 이렇게 하는 게 힘들기 때문에 checkedException으로 발생 시 try catch로 잡아서 uncheckedException으로 바꾸어서 에러 발생시키는 방법도 있음
커스텀 예외 사용
[참고] custom exception을 언제 써야 할까? — https://tecoble.techcourse.co.kr/post/2020-08-17-custom-exception/
Chained Exception
- 한 예외가 다른 예외를 발생시킬 수 있는데 예를 들어 예외 A가 예외 B를 발생시켰다면 A를 B의 원인 예외라고 함
try{ }catch(SpaceException e){ InstallException ie = new InstallException(""); ie.initCause(e); throw ie; }