Java

에러(Error)와 예외(Exception)

Jay-JI 2023. 9. 4. 00:01

try-catch 문에 Exception 처리 과정을 만들고 특정 메소드에서 throws Exception 처리를 하는 건 대부분의 자바 개발자 분들에게는 익숙한 광경입니다. 그런데 정작 예외 처리 방법은 알고 있으면서 에러나 예외의 개념에 대해서는 다소 두루뭉술하게 알고 있는 경우가 많습니다.

 

오늘은 에러와 예외의 개념을 좀 더 명확하게 짚어보고자 합니다.

 

 

에러(Error)

자바에서 에러란 자바 프로그램 밖에서 발생한 문제로 인해 응용프로그램 실행 오류가 발생하는 것을 의미합니다. OS에 문제가 발생해 응용 프로그램에 문제가 발생하는 경우가 이에 해당한다고 볼 수 있습니다. 에러는 아무리 프로그램을 견고하게 만든다 한들 개발자가 직접 대처할 수 있는 방법이 없습니다.

 

예외(Exception)

잘못된 사용 또는 잘못된 코딩으로 인한 오류를 말합니다. 예외가 발생하면 프로그램이 곧바로 종료된다는 점은 에러와 동일합니다. 하지만 예외는 예외처리를 통해 계속 실행 상태를 유지할 수 있다는 점에서 에러와 다릅니다.

 

  • 자바에서 에러와 예외는 클래스로 관리되며 둘 다 Throwable 클래스를 상속받습니다.
  • Throwable 클래스에는 다음과 같은 메소드가 정의되어 있습니다.
    - public String getMessage() : 오류/예외의 원인을 담고 있는 문자열 반환
    - public void printStackTrace() : 오류/예외가 발생한 위치와 호출된 메소드 정보 출력

 

예외의 종류

1) Checked Exception
  - 컴파일러가 예외 처리 코드 여부를 검사하는 예외
  - 예외 처리를 하지 않으면 컴파일이 진행되지 않습니다.
  - 대표적으로 SQLException, ClassNotFoundException, IOException이 있습니다.

 

2) Unchecked Exception
  - 컴파일러가 예외 처리 코드 여부를 검사하지 않는 예외
  - 컴파일 후 런타임 시 발생할 수 있는 예외입니다.
  - 대표적으로 NullPointerException, ArrayIndexOutOfBoundsException이 있습니다.

 

 

예외 처리 방법

1) 예외 복구 : 예외 상황을 파악하고 문제를 해결해서 정상 상태로 돌려놓는 방법
2) 예외 회피 : 예외 처리를 직접하지 않고 throws를 통해 호출한 쪽으로 던져 회피하는 방법
3) 예외 전환 : 예외 회피와 비슷하게 예외를 throws 하지만 그냥 던지지 않고 적절한 예외로 전환해서 넘기는 방법

 


Q&A

* main 메소드에 보면 항상 throws IOException 가 적용되어 있는데 여기에서 발생하는 예외는 어디에서 처리해주나요?
  - Exception이 발생하면 해당 Exception은 Call Stack의 최상단까지 거슬러 올라가게 됩니다.
  - 올라가다보면 Java의 최상단 메소드인 main() 메소드까지 올라가고 여기서도 잡히지 않으면 Exception은 결국 JVM 까지 거슬러올라갑니다.

- JVM은 Exception을 받게되면 console에 stack trace를 프린트한 후 non-zero exit code 로 프로그램을 종료(terminate)합니다.


출처 :
https://www.youtube.com/watch?v=mrrEPbGF6hQ

https://dololak.tistory.com/52
https://dololak.tistory.com/53
https://cocobi.tistory.com/146
https://jhyonhyon.tistory.com/66
신용권,임경균 - [이것이 자바다] , 한빛미디어 , 2022