[JAVA] 13. μ˜ˆμ™Έ λ°œμƒ, finally, μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ, μ˜ˆμ™Έ λ˜λ˜μ§€κΈ°, μ—°κ²°λœ μ˜ˆμ™Έ

2022. 5. 1. 13:25ㆍJAVA/μžλ°”μ˜ 정석

728x90

https://hyejin.tistory.com/573

 

[JAVA] 12. μ˜ˆμ™Έμ²˜λ¦¬ Exception handling

1️⃣ ν”„λ‘œκ·Έλž¨ 였λ₯˜ ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰ 쀑 μ–΄λ–€ 원인에 μ˜ν•΄μ„œ μ˜€μž‘λ™μ„ ν•˜κ±°λ‚˜ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜λŠ” κ²½μš°κ°€ μžˆλŠ”λ° μ΄λŸ¬ν•œ κ²°κ³Όλ₯Ό μ΄ˆλž˜ν•˜λŠ” 원인을 ν”„λ‘œκ·Έλž¨ μ—λŸ¬ λ˜λŠ” 였λ₯˜λΌκ³  ν•œλ‹€. 이λ₯Ό

hyejin.tistory.com

 

1️⃣ μ˜ˆμ™Έ λ°œμƒμ‹œν‚€κΈ° 

ν‚€μ›Œλ“œ throw λ₯Ό μ‚¬μš©ν•΄μ„œ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 고의둜 μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆλ‹€. 

 

1. λ¨Όμ €, μ—°μ‚°μž new λ₯Ό μ΄μš©ν•΄μ„œ λ°œμƒμ‹œν‚€λ €λŠ” μ˜ˆμ™Έ 클래슀의 객체λ₯Ό λ§Œλ“  λ‹€μŒ 

Exception e = new Exception("μ˜ˆμ™Έ λ°œμƒ");

2. ν‚€μ›Œλ“œ throw λ₯Ό μ΄μš©ν•΄μ„œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€. 

throw e; 

 

2️⃣ checked μ˜ˆμ™Έμ™€ unchecked μ˜ˆμ™Έ 

checked μ˜ˆμ™Έ : μ»΄νŒŒμΌλŸ¬κ°€ μ˜ˆμ™Έμ²˜λ¦¬ μ—¬λΆ€λ₯Ό 체크 (μ˜ˆμ™Έμ²˜λ¦¬ ν•„μˆ˜)

unchecked μ˜ˆμ™Έ : μ»΄νŒŒμΌλŸ¬κ°€ μ˜ˆμ™Έμ²˜λ¦¬ μ—¬λΆ€λ₯Ό 체크 μ•ˆν•¨ (μ˜ˆμ™Έμ²˜λ¦¬ 선택) 

checked μ˜ˆμ™Έ

-> 이 μ˜ˆμ œλŠ” μž‘μ„±ν•œ 후에 μ»΄νŒŒμΌμ„ ν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•˜μ—¬ 컴파일이 μ™„λ£Œλ˜μ§€ μ•ŠλŠ” 것을 확인할 수 μžˆλ‹€.

μ˜ˆμ™Έμ²˜λ¦¬κ°€ λ˜μ–΄μ•Ό ν•  뢀뢄에 μ˜ˆμ™Έμ²˜λ¦¬κ°€ λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λŠ” 것이닀. 

 

unchecked μ˜ˆμ™Έ

-> 이 μ˜ˆμ œλŠ” μ˜ˆμ™Έ 처리λ₯Ό ν•˜μ§€ μ•Šμ•˜μŒμ—λ„ λΆˆκ΅¬ν•˜κ³  μ΄μ „μ˜ μ˜ˆμ œμ™€λŠ” λ‹€λ₯΄κ²Œ μ„±κ³΅μ μœΌλ‘œ 컴파일이 될 것이닀. 

ν•˜μ§€λ§Œ μ‹€ν–‰ν•˜λ©΄ RuntimeException이 λ°œμƒν•˜μ—¬ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλœλ‹€. 

 

 

3️⃣ λ©”μ„œλ“œμ— μ˜ˆμ™Έ μ„ μ–Έν•˜κΈ° 

μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” λ°©λ²•μ—λŠ” try~catch문을 μ‚¬μš©ν•˜λŠ” 것 외에, μ˜ˆμ™Έλ₯Ό λ©”μ„œλ“œμ— μ„ μ–Έν•˜λŠ” 방법이 μžˆλ‹€. 

λ©”μ„œλ“œμ— μ˜ˆμ™Έλ₯Ό μ„ μ–Έν•˜λ €λ©΄, λ©”μ„œλ“œμ˜ 선언뢀에 ν‚€μ›Œλ“œ throwsλ₯Ό μ‚¬μš©ν•΄μ„œ λ©”μ„œλ“œ λ‚΄μ—μ„œ λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έλ₯Ό μ μ–΄μ£ΌκΈ°λ§Œ ν•˜λ©΄ λœλ‹€. 

그리고 μ˜ˆμ™Έκ°€ μ—¬λŸ¬κ°œμΌ κ²½μš°μ—λŠ” μ‰Όν‘œ, 둜 κ΅¬λΆ„ν•œλ‹€. 

 

void method() throws Exception {

  ...

-> μ΄λ ‡κ²Œ μ˜ˆμ™Έλ₯Ό μ„ μ–Έν•˜λ©΄, 이 μ˜ˆμ™Έ 뿐만 μ•„λ‹ˆλΌ κ·Έ μžμ†νƒ€μž…μ˜ μ˜ˆμ™ΈκΉŒμ§€ λ°œμƒν•  수 μžˆλ‹€λŠ” 점에 μ£Όμ˜ν•΄μ•Όν•œλ‹€. 

μ•žμ„œ μ˜€λ²„λΌμ΄λ”©μ—μ„œ μ‚΄νŽ΄λ³Έ 것과 같이 μ˜€λ²„λΌμ΄λ”©ν•  λ•ŒλŠ” λ‹¨μˆœνžˆ μ„ μ–Έλœ μ˜ˆμ™Έμ˜ 개수 뿐만 μ•„λ‹ˆλΌ μƒμ†κ΄€κ³„κΉŒμ§€ κ³ λ €ν•΄μ•Όν•œλ‹€. 

 

λ©”μ„œλ“œμ˜ 선언뢀에 μ˜ˆμ™Έλ₯Ό μ„ μ–Έν•¨μœΌλ‘œμ¨ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ €λŠ” μ‚¬λžŒμ΄ λ©”μ„œλ“œμ˜ μ„ μ–ΈλΆ€λ₯Ό λ³΄μ•˜μ„ λ•Œ, 이 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ–΄λ– ν•œ μ˜ˆμ™Έλ“€μ΄ μ²˜λ¦¬λ˜μ–΄μ•Όν•˜λŠ”μ§€ μ‰½κ²Œ μ•Œ 수 μžˆλ‹€. 

 

μ˜ˆμ™Έμ— throws λ₯Ό λͺ…μ‹œν•˜λŠ” 것은 μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μžμ‹ μ„ ν˜ΈμΆœν•œ λ©”μ„œλ“œμ—κ²Œ μ˜ˆμ™Έλ₯Ό μ „λ‹¬ν•˜μ—¬ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν”Όν•˜λŠ” 것이닀. 

μ˜ˆμ™Έλ₯Ό 전달받은 λ©”μ„œλ“œκ°€ 또 λ‹€μ‹œ μžμ‹ μ„ ν˜ΈμΆœν•œ λ©”μ„œλ“œμ—κ²Œ 전달할 수 있으며, μ΄λŸ°μ‹μœΌλ‘œ 계속 ν˜ΈμΆœμŠ€νƒμ— μžˆλŠ” λ©”μ„œλ“œλ“€μ„ 따라 μ „λ‹¬λ˜λ‹€κ°€ 제일 λ§ˆμ§€λ§‰μ— μžˆλŠ” main λ©”μ„œλ“œμ—μ„œλ„ μ˜ˆμ™Έκ°€ μ²˜λ¦¬λ˜μ§€ μ•ŠμœΌλ©΄ main λ©”μ„œλ“œλ§ˆμ € μ’…λ£Œλ˜μ–΄ ν”„λ‘œκ·Έλž¨μ΄ 전체가 μ’…λ£Œλœλ‹€. 

 

이처럼 μ˜ˆμ™Έκ°€ λ°œμƒν•œ λ©”μ„œλ“œμ—μ„œ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•˜μ§€ μ•Šκ³  μžμ‹ μ„ ν˜ΈμΆœν•œ λ©”μ„œλ“œμ—κ²Œ μ˜ˆμ™Έλ₯Ό λ„˜κ²¨μ€„ 수 μžˆμ§€λ§Œ, μ΄κ²ƒμœΌλ‘œ μ˜ˆμ™Έκ°€ 처리된 것이 μ•„λ‹ˆκ³  μ˜ˆμ™Έλ₯Ό λ‹¨μˆœνžˆ μ „λ‹¬λ§Œ ν•˜λŠ” 것이닀. 

κ²°κ΅­ μ–΄λŠ ν•œ κ³³μ—μ„œλŠ” λ°˜λ“œμ‹œ try~catch 문으둜 μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•΄μ£Όμ–΄μ•Όν•œλ‹€. 

 

-> μ˜ˆμ™Έκ°€ λ°œμƒν•œ λ©”μ„œλ“œ λ‚΄μ—μ„œ 자체적으둜 μ²˜λ¦¬ν•΄λ„ λ˜λŠ” 것은 λ©”μ„œλ“œ λ‚΄μ—μ„œ try~catch 문을 μ‚¬μš©ν•΄μ„œ μ²˜λ¦¬ν•œλ‹€. 

 

 

4️⃣ finally λΈ”λŸ­ 

finally λΈ”λŸ­μ€ μ˜ˆμ™Έμ˜ λ°œμƒμ—¬λΆ€μ— 상관없이 μ‹€ν–‰λ˜μ–΄μ•Ό ν•  μ½”λ“œλ₯Ό ν¬ν•¨μ‹œν‚¬ λͺ©μ μœΌλ‘œ μ‚¬μš©λœλ‹€. 

try-catch문의 끝에 μ„ νƒμ μœΌλ‘œ 덧뢙여 μ‚¬μš©ν•  수 있으며, try-catch-finally 의 μˆœμ„œλŒ€λ‘œ κ΅¬μ„±λœλ‹€.

 

try {

    // μ˜ˆμ™Έκ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” λ¬Έμž₯듀을 λ„£λŠ”λ‹€. 

} catch(Exception e) {

   // μ˜ˆμ™Έ 처리λ₯Ό μœ„ν•œ λ¬Έμž₯을 λ„£λŠ”λ‹€.

} finally {

   // μ˜ˆμ™Έμ˜ λ°œμƒμ—¬λΆ€μ— 관계없이 항상 μˆ˜ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” λ¬Έμž₯듀을 λ„£λŠ”λ‹€.

 

μ˜ˆμ™Έκ°€ λ°œμƒν•œ κ²½μš°μ—λŠ” try -> catch -> finally 순으둜 μ‹€ν–‰ 

μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ€ κ²½μš°μ—λŠ” try -> finally 순으둜 μ‹€ν–‰ 

 

 

5️⃣ μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έλ₯Ό λ§Œλ“€κΈ° 

기쑴에 μ •μ˜λœ μ˜ˆμ™Έ 클래슀 외에 ν•„μš”μ— 따라 ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μƒˆλ‘œμš΄ μ˜ˆμ™Έ 클래슀λ₯Ό μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€. 

보톡 Exception 클래슀 λ˜λŠ” RuntimeException ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받아 클래슀λ₯Ό λ§Œλ“€μ§€λ§Œ, ν•„μš”μ— λ”°λΌμ„œ μ•Œλ§žμ€ μ˜ˆμ™Έ 클래슀λ₯Ό 선택할 수 μžˆλ‹€. 

 

기쑴의 μ˜ˆμ™Έ ν΄λž˜μŠ€λŠ” 주둜 Exception 을 μƒμ†λ°›μ•„μ„œ checked μ˜ˆμ™Έλ‘œ μž‘μ„±ν•˜λŠ” κ²½μš°κ°€ λ§Žμ•˜μ§€λ§Œ μš”μ¦˜μ€ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό μ„ νƒμ μœΌλ‘œ ν•  수 μžˆλ„λ‘ RuntimeException을 μƒμ†λ°›μ•„μ„œ μž‘μ„±ν•˜λŠ” μͺ½μœΌλ‘œ λ°”λ€Œμ–΄κ°€κ³  μžˆλ‹€. checked μ˜ˆμ™ΈλŠ” λ°˜λ“œμ‹œ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•΄μ£Όμ–΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— μ˜ˆμ™Έ μ²˜λ¦¬κ°€ λΆˆν•„μš”ν•œ κ²½μš°μ—λ„ try~catch문을 λ„£μ–΄μ„œ μ½”λ“œκ°€ λ³΅μž‘ν•΄μ§€κΈ° λ•Œλ¬Έμ΄λ‹€. 

 

ν”„λ‘œκ·Έλž˜λ° ν™˜κ²½μ΄ 달라진 만큼 ν•„μˆ˜μ μœΌλ‘œ μ²˜λ¦¬ν•΄μ•Όλ§Œ ν•  것 κ°™μ•˜λ˜ μ˜ˆμ™Έλ“€μ΄ μ„ νƒμ μœΌλ‘œ μ²˜λ¦¬ν•΄λ„ λ˜λŠ” μƒν™©μœΌλ‘œ λ°”λ€ŒλŠ” κ²½μš°κ°€ μ’…μ’… λ°œμƒν•˜κ³  μžˆλ‹€. κ·Έλž˜μ„œ ν•„μš”μ— 따라 μ˜ˆμ™Έμ²˜λ¦¬μ˜ μ—¬λΆ€λ₯Ό 선택할 수 μžˆλŠ” unchecked μ˜ˆμ™Έκ°€ κ°•μ œμ μΈ checked μ˜ˆμ™Έλ³΄λ‹€ 더 ν™˜μ˜λ°›κ³  μžˆλ‹€. 

 

 

6️⃣ μ˜ˆμ™Έ λ˜λ˜μ§€κΈ° exception re-throwing 

ν•œ λ©”μ„œλ“œμ—μ„œ λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έκ°€ μ—¬λŸΏμΈ 경우, λͺ‡ κ°œλŠ” try-catch문을 ν†΅ν•΄μ„œ λ©”μ„œλ“œ λ‚΄μ—μ„œ 자체적으둜 μ²˜λ¦¬ν•˜κ³ , κ·Έ λ‚˜λ¨Έμ§€λŠ” 선언뢀에 μ§€μ •ν•˜μ—¬ ν˜ΈμΆœν•œ λ©”μ„œλ“œμ—μ„œ μ²˜λ¦¬ν•˜λ„λ‘ ν•¨μœΌλ‘œμ¨, μ–‘μͺ½μ—μ„œ λ‚˜λˆ μ„œ μ²˜λ¦¬λ˜λ„λ‘ ν•  수 μžˆλ‹€. 

그리고 μ‹¬μ§€μ–΄λŠ” 단 ν•˜λ‚˜μ˜ μ˜ˆμ™Έμ— λŒ€ν•΄μ„œλ„ μ˜ˆμ™Έκ°€ λ°œμƒν•œ λ©”μ„œλ“œμ™€ ν˜ΈμΆœν•œ λ©”μ„œλ“œ, μ–‘μͺ½μ—μ„œ μ²˜λ¦¬ν•˜λ„λ‘ ν•  수 μžˆλ‹€.

 

이것은 μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•œ 후에 μΈμœ„μ μœΌλ‘œ λ‹€μ‹œ λ°œμƒμ‹œν‚€λŠ” 방법을 ν†΅ν•΄μ„œ κ°€λŠ₯ν•œλ°, 이것을 μ˜ˆμ™Έ λ˜μ§€κΈ° 라고 ν•œλ‹€. 

 

λ¨Όμ € μ˜ˆμ™Έκ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” λ©”μ„œλ“œμ—μ„œ try-catch문을 μ‚¬μš©ν•΄μ„œ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•΄μ£Όκ³ , catchλ¬Έμ—μ„œ ν•„μš”ν•œ μž‘μ—…μ„ ν–‰ν•œ 후에 throw 문을 μ‚¬μš©ν•΄μ„œ μ˜ˆμ™Έλ₯Ό λ‹€μ‹œ λ°œμƒμ‹œν‚¨λ‹€. 

λ‹€μ‹œ λ°œμƒν•œ μ˜ˆμ™ΈλŠ” 이 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ©”μ„œλ“œμ—μ„œ μ „λ‹¬λ˜κ³  ν˜ΈμΆœν•œ λ©”μ„œλ“œμ˜ try-catchλ¬Έμ—μ„œ μ˜ˆμ™Έλ₯Ό 또 λ‹€μ‹œ μ²˜λ¦¬ν•œλ‹€. 

 

이 방법은 ν•˜λ‚˜μ˜ μ˜ˆμ™Έμ— λŒ€ν•΄μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•œ λ©”μ„œλ“œμ™€ 이λ₯Ό ν˜ΈμΆœν•œ λ©”μ„œλ“œ μ–‘μͺ½ λͺ¨λ‘μ—μ„œ μ²˜λ¦¬ν•΄μ€˜μ•Όν•  μž‘μ—…μ΄ μžˆμ„ λ•Œ μ‚¬μš©λœλ‹€. 

이 λ•Œ μ£Όμ˜ν•΄μ•Όν•  점은 μ˜ˆμ™Έκ°€ λ°œμƒν•  λ©”μ„œλ“œμ—μ„œλŠ” try-catch문을 μ‚¬μš©ν•΄μ„œ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•΄μ€Œκ³Ό λ™μ‹œμ— λ©”μ„œλ“œμ˜ 선언뢀에 λ°œμƒν•  μ˜ˆμ™Έλ₯Ό throws에 μ§€μ •ν•΄μ€˜μ•Ό ν•œλ‹€λŠ” 것이닀. 

 

 

7️⃣ μ—°κ²°λœ μ˜ˆμ™Έ chained Exception 

ν•œ μ˜ˆμ™Έκ°€ λ‹€λ₯Έ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¬ μˆ˜λ„ μžˆλ‹€. 예λ₯Ό λ“€μ–΄ μ˜ˆμ™Έ Aκ°€ μ˜ˆμ™Έ Bλ₯Ό λ°œμƒμ‹œμΌ°λ‹€λ©΄ Aλ₯Ό B의 원인 μ˜ˆμ™ΈλΌκ³  ν•œλ‹€. 

Throwable initCause(Throwable cause) : μ§€μ •ν•œ μ˜ˆμ™Έλ₯Ό 원인 μ˜ˆμ™Έλ‘œ 등둝 
Throwable getCause() : 원인 μ˜ˆμ™Έλ₯Ό λ°˜ν™˜ 

λ°œμƒν•œ μ˜ˆμ™Έλ₯Ό κ·Έλƒ₯ μ²˜λ¦¬ν•˜λŠ” 것이 μ•„λ‹ˆκ³  원인 μ˜ˆμ™Έλ‘œ λ“±λ‘ν•΄μ„œ λ‹€μ‹œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” 이유 : 

 - μ—¬λŸ¬κ°€μ§€ μ˜ˆμ™Έλ₯Ό ν•˜λ‚˜μ˜ 큰 λΆ„λ₯˜μ˜ μ˜ˆμ™Έλ‘œ λ¬Άμ–΄μ„œ 닀루기 μœ„ν•΄μ„œ 

 - checked μ˜ˆμ™Έλ₯Ό unchecked μ˜ˆμ™Έλ‘œ λ°”κΏ€ 수 μžˆλ„λ‘ ν•˜κΈ° μœ„ν•΄μ„œ 

: checked μ˜ˆμ™Έκ°€ λ°œμƒν•΄λ„ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•  수 μ—†λŠ” 상황이 ν•˜λ‚˜ λ‘˜ λ°œμƒν•˜κΈ° μ‹œμž‘ν–ˆλ‹€. 이럴 λ•Œ ν•  수 μžˆλŠ” 일이라곀 κ·Έμ € μ˜λ―Έμ—†λŠ” try-catch 문을 μΆ”κ°€ν•˜λŠ” 것뿐인데, chekced μ˜ˆμ™Έλ₯Ό unchekced μ˜ˆμ™Έλ‘œ λ°”κΎΈλ©΄ μ˜ˆμ™Έμ²˜λ¦¬κ°€ 선택적이 λ˜λ―€λ‘œ μ–΅μ§€λ‘œ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. 

.

-> MemoryException은 Exception의 μžμ†μœΌλ‘œ λ°˜λ“œμ‹œ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•΄μ•Όν•˜λŠ”λ° 이 μ˜ˆμ™Έλ₯Ό RuntimeException으둜 감싸버렸기 λ•Œλ¬Έμ—uncheked μ˜ˆμ™Έκ°€ λ˜μ—ˆλ‹€. 

 

 

 

 

 

 

 

 

 

 

 

728x90