try-catch-final 예외 처리

Jan 28, 2024
try-catch-final 예외 처리

1. 예외 처리란?

try-catch 문을 사용하여 수행된다. try 블록 내에서 예외(문제)가 발생할 수 있는 코드를 작성한다. (해당 예외를 처리하기 위한 catch 블록을 작성해야 한다.) catch 블록은 어떻게 예외를 처리할지에 대한 코드를 작성한다. finally 블록은 예외가 발생하든 발생하지 않든 항상 실행되어야 하는 코드를 작성한다.
💡
예외 처리를 통해 프로그램이 예외 상황에 대처하면서 계속 실행될 수 있고, 사용자에게 친절한 오류 메시지를 제공할 수 있다.
💡
버그 =/= 예외 버그 : 프로그램이 의도한 대로 작동하지 않는 오류 예외 : 프로그램 실행 중에 예상치 못한 상황이 발생할 때 발생하는 오류
 

2. try-catch 구조

try { //예외가 발생할 수 있는 코드 result = 10 / 2; result = 10 / 0; <여기서 에러 터지니까, 아래 result1, 2는 실행하지 않고 바로 catch로 넘어감 result1 = 10 / 20; result2 = 10 / 5; } catch (예외클래스 변수) { //예외를 처리하는 코드 System.out.println("0으로 나누면 안돼요."); throw new RuntimeException("0으로 나눌 수 없어요"); } finally { //공통적으로, try블록이 끝나면 무조건 실행되는 것. (마지막 마무리) System.out.println("try/catch 통과!!");
💡
예외마다 하나의 catch 블록을 지정한다.
notion image
 

3. 예외의 2가지 유형

3-1. Checked Exception - 컴파일 익셉션 - 부모 클래스가 알려주는 오류

컴파일러가 예외 처리를 강제하는 예외 IOException, SQLException 등과 같은 예외들을 포함한다. 이러한 예외들은 반드시 예외 처리 코드를 작성해야 한다.
💡
코드를 적는 순간, 실행하기도 전에 알 수 있는 exception (미리 잡히는 예외) > 예외클래스를 NullPointerException 이런 식으로 자세하게 적지 말고, 그냥 Exception으로 퉁쳐라. 그게 편하다.
 

3-2. Unchecked Exception - 런타임 익셉션 - 부모 클래스가 안알랴줌

컴파일러가 예외 처리를 강제하지 않는 예외 RuntimeException 클래스를 상속받은 예외들을 포함한다. 예외 처리 코드를 작성하지 않아도 되지만, 프로그램 실행 중에 예외가 발생하면 예외를 처리하지 않은 상태로 프로그램이 종료될 수 있다. ex) NullPointerException, ArrayIndexOutOfBoundsException 등
💡
실행하면 알 수 있는 exception (예상 못하는 예외)
 

4. 예외 처리 예시

4-1. 예외 발생

notion image
'(10 / 0)' 은 수학적으로는 정의되지 않는 연산이라 예외 발생 * ArithmeticException = 수학적으로 유효하지 않은 연산을 수행할 때 발생 > 실행시 에러 : Unchecked Exception
 

 
notion image
notion image
실행할때 에러가 뜨는 런타임 exception 발생!
0을 넣을 때만 이런 오류가 나네? > 이런걸 예외처리 해줘야함
 

4-2. 예외 처리하는 법

notion image
예외처리 하려는 코드를 드래그한 후 [ ctrl + alt + t ]
notion image
try-catch 문으로 예외처리 함. +) int result;도 가능
 

 
notion image
💡
Exception e 는 Exception e = new ArithmeticException() 이랑 같은 말. 다형성!!
 

4-3. getMessage() && printStackTrace()

[ getMessage() ]
notion image
💡
getMessage()는 자바에서 Throwable 클래스의 메서드로, 예외 객체가 가지고 있는 메시지를 반환하는 역할을 한다. getMessage() 메서드를 호출하면 예외 객체에 저장된 메시지를 문자열 형태로 반환
💡
* Throwable 1부모 (Throwable이 getMessage() 들고 있는 것 확인)
* Exception 2부모 → getMessage() XXX
* RuntimeException 3부모 → getMessage() XXX
* ArithMethicException 자식 → getMessage() XXX
  • Throwable은 모든 예외 클래스의 조상 클래스 즉, getMessage()는 Throwable의 메소드가 때려지는 것
 

[ 스택 트레이스란? ]
스택 트레이스는 예외가 발생한 메서드 호출들의 역순으로 나열된 정보로, 각각의 메서드 호출은 클래스, 메서드 이름, 파일 이름, 라인 번호 등의 정보를 포함한다. 이를 통해 예외가 발생한 원인을 파악하고, 예외가 어떤 경로로 전파되었는지 확인 가능.
 
[ printStackTrace() ] ✓
자바에서 예외가 발생했을 때, 그 예외가 어떤 경로를 따라 발생했는지를 보여주는 것
notion image
notion image
printStackTrace() 하니 [클래스 이름, 메서드 이름, 파일 이름, 라인 번호] 등의 정보가 다 나온다.
notion image
getClass() 메서드를 사용하여 예외 객체의 클래스 정보를 얻으면, 해당 예외 클래스의 이름, 패키지 정보, 상위 클래스 등의 정보를 확인할 수 있다.
 

 
  • 어떤 오류가 뜰지는 터져봐야 안다.
catch (Exception e) { ArithmeticException()인지 뭔지 터지기 전에 어떻게 알아? 모른다! 터지고 나서 안다! 터지고 나서, 오류 메세지를 확인한 후, try-catch로 감싼다. (e = 변수명)
 

 
💡
베타테스터 하는 이유 : 내가 경우의 수로 아무리 많이 값을 넣어서 돌려봐도 다 캐치하진 못하니까 유저들을 이용해서 오류를 잡아냄. stackTrace로 추적하고, catch를 하나씩 늘려나가는 것.
 
 
Share article

codingb