Programming/Java

F006 - Throwable, Exception, Error

osean 2021. 5. 11. 02:16
✍️ 처음 ν”„λ‘œκ·Έλž˜λ°μ„ μ ‘ν•  λ•Œκ³  κ·Έλ ‡κ³ , ν˜„μž¬κΉŒμ§€λ„ κ·Έλ ‡μ§€λ§Œ μ½˜μ†”μ°½μ— λΉ¨κ°„ 글씨가 λ‚˜μ˜¬ λ•Œλ‚˜ κ°‘μžκΈ° λ§Žμ€ λ¬Έμžλ“€μ΄ ν™• 올라올 λ•Œ 등골이 μ˜€μ‹Ήν•œλ‹€.
처음 ν”„λ‘œκ·Έλž˜λ° μŠ΅κ΄€μ„ 잘λͺ» λ“€μ—¬μ„œ κ·ΈλŸ°μ§€ μ˜ˆμ™Έλ‚˜ μ—λŸ¬κ°€ λ°œμƒν•˜λ©΄ μ™œ λ°œμƒν–ˆλŠ”μ§€ 따져보기 보단 일단 μΉ˜μ›Œλ²„λ¦¬λ €κ³  메세지λ₯Ό λ³΅μ‚¬ν•΄μ„œ ꡬ글창에 κ²€μƒ‰ν•˜κ³  남듀이 ν•΄κ²°ν•œ μ½”λ“œλ₯Ό κ·ΈλŒ€λ‘œ 볡사, λΆ™ν˜€λ„£κΈ° λ°”λΉ΄λ˜ 것 κ°™λ‹€.
μžλ°”μ˜ 신을 μ½μœΌλ©΄μ„œ μ˜ˆμ™Έμ— λŒ€ν•΄ λ‹€μ‹œ μ ‘ν•˜κ²Œ λλŠ”λ° 이번 κΈ°νšŒμ— μ˜ˆμ™Έ 곡포증을 이겨보렀고 ν•œλ‹€.

μ˜ˆμ™Έμ˜ 쑰상

Reference Type μ±•ν„°μ—μ„œ κ³΅λΆ€ν–ˆλ˜ λ‚΄μš©κ³Ό μ—°κ²°ν•΄μ„œ, λͺ¨λ“  클래슀의 쑰상은 java.lang.Object(μ΄ν•˜ Object 클래슀)이닀. μ˜ˆμ™Έμ— μ†ν•œ ν΄λž˜μŠ€λ“€λ„ 이 μ‘°κ±΄μ—μ„œ λ²—μ–΄λ‚˜μ§€ μ•ŠλŠ”λ‹€. λ‹€λ§Œ λͺ¨λ“  μ˜ˆμ™Έλ“€μ˜ 아버지라고 ν•  수 μžˆλŠ” μ‘΄μž¬κ°€ μžˆλŠ”λ°, κ·Έ ν΄λž˜μŠ€λŠ” λ°”λ‘œ java.lang.Throwable(μ΄ν•˜ Throwable 클래슀)이닀.

The Throwable class is the superclass of all errors and exceptions in the Java language. Only objects that are instances of this class (or one of its subclasses) are thrown by the Java Virtual Machine or can be thrown by the Java throw statement.
- Oracle Java 8 API

API λ¬Έμ„œλ₯Ό 듀여닀보면 Throwable ν΄λž˜μŠ€μ— λŒ€ν•œ κ°œμš”μ— λŒ€ν•œ μ„€λͺ…이 λ‚˜μ™€ μžˆλŠ”λ°, κ°„λ‹¨νžˆ μ„œμˆ ν•˜μžλ©΄ Throwable ν΄λž˜μŠ€λŠ” Java μ—μ„œ μΌμ–΄λ‚˜λŠ” λͺ¨λ“  μ—λŸ¬μ™€ μ˜ˆμ™Έμ— λŒ€ν•œ SuperClass(μ΅œμƒμœ„ 클래슀, λͺ¨λ“  μ—λŸ¬μ™€ μ˜ˆμ™Έκ°€ κ°€μ§€λŠ” 곡톡 λΆ„λͺ¨)이닀. Throwable 클래슀λ₯Ό 상속 λ°›λŠ” ν΄λž˜μŠ€λ“€λ§Œ JVM에 μ˜ν•΄ μ˜ˆμ™Έ ν˜Ήμ€ μ—λŸ¬ λ°œμƒ μ‹œ, throw μ²˜λ¦¬λœλ‹€.

Throwable ν΄λž˜μŠ€λ„ κΈ°λ³Έ μƒμ„±μžλ₯Ό 톡해 μ„ μ–Έ κ°€λŠ₯ν•˜λ©°,
String을 맀개 λ³€μˆ˜λ‘œ λ°›λŠ” μƒμ„±μžλ₯Ό 톡해 직접 μ˜ˆμ™Έ 메세지λ₯Ό 지정해 μ„ μ–Έν•  수 μžˆλ‹€.

  • Throwable()
  • Throwable(String message)

λ˜ν•œ, Object 클래슀λ₯Ό 상속 λ°›λ‹€λ³΄λ‹ˆ Object 클래슀의 λ©”μ†Œλ“œλ₯Ό Overriding ν•˜μ—¬ μž¬μ •μ˜ν•œ λ©”μ†Œλ“œλ„ μ‘΄μž¬ν•œλ‹€. λŒ€λΆ€λΆ„μ˜ λ©”μ†Œλ“œλŠ” μ˜ˆμ™Έ ν˜Ήμ€ μ—λŸ¬ λ°œμƒ μ‹œ κ³΅ν†΅μ μœΌλ‘œ ν•„μš”ν•œ κ²ƒλ“€λ§Œ λ§Œλ“€μ–΄μ Έμžˆλ‹€.

  • toString()

Throwable ν΄λž˜μŠ€μ—λŠ” λŒ€ν‘œμ μΈ ν•˜μœ„ 클래슀 두 κ°œκ°€ μ‘΄μž¬ν•˜λŠ”λ°, μ•žμ—μ„œλ„ 많이 μ–ΈκΈ‰ν–ˆλ˜ java.lang.Error(μ΄ν•˜ Error 클래슀)와 java.lang.Exception(μ΄ν•˜ Exception 클래슀)이닀.

이 두 ν΄λž˜μŠ€λŠ” μ„œλ‘œ λ‹€λ₯Έ 차이가 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— Throwable ν΄λž˜μŠ€μ—μ„œ κ°ˆλΌμ‘Œλ‹€κ³  μ΄ν•΄ν•˜λ©΄ νŽΈν•˜λ©° 이 두 ν΄λž˜μŠ€μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž.

Error / Exception

Error

Error ν΄λž˜μŠ€λŠ” IOError, ThreadDeath, VirtualMachineError λ“± Error 클래슀λ₯Ό μƒμ†λ°›λŠ” 클래슀의 이름을 보면 μ•Œ 수 μžˆλ“― 개발자의 손을 λ²—μ–΄λ‚œ ν”„λ‘œκ·Έλž¨ λ°”κΉ₯μ—μ„œ λ°œμƒν•œ μ˜ˆμ™Έλ₯Ό λœ»ν•œλ‹€. λ•Œλ¬Έμ— Error ν΄λž˜μŠ€λŠ” ν”„λ‘œμ„ΈμŠ€μ— 영ν–₯을 λ―ΈμΉœλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— Error 클래슀 및 μžμ‹ ν΄λž˜μŠ€λŠ” 비정상적인 쑰건 μ†μ—μ„œ λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— try ~ catch ꡬ문으둜 ν•΄κ²° ν•  수 μ—†λ‹€. (μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‹¨μ—μ„œ ν•΄λ‹Ή μ΄μŠˆμ— λŒ€ν•΄ κ°œλ°œμžκ°€ μ²˜λ¦¬ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.)

Exception

κ°œλ°œν•˜λ©΄μ„œ κ°€μž₯ 많이 λ§Œλ‚˜κ²Œ 되고, λ§Œλ‚˜κΈ° λ‘λ €μš΄ μ‘΄μž¬κ°€ λ°”λ‘œ Exception ν΄λž˜μŠ€μ΄λ‹€. Exception ν΄λž˜μŠ€λŠ” Error ν΄λž˜μŠ€μ™€ λ‹€λ₯΄κ²Œ try ~ catch ꡬ문으둜 ν•΄λ‹Ή μ˜ˆμ™Έλ₯Ό μž‘μ•„ 처리 κ°€λŠ₯ν•˜λ‹€. λ•Œλ¬Έμ— 이에 λŒ€ν•΄ 두 κ°€μ§€λ‘œ λ‚˜λ‰˜μ–΄ μ§€λŠ”λ°, Checked Exceptionκ³Ό Runtime Exception(+ Unchecked Exception)이닀.

Runtime Exception(+ Unchecked Exception)

ν•΄λ‹Ή μ˜μ—­μ— μ†ν•˜λŠ” μ˜ˆμ™Έ ν΄λž˜μŠ€λŠ” RunTime Exception 클래슀λ₯Ό ν¬ν•¨ν•œ μžμ‹ ν΄λž˜μŠ€λ“€μ„ λœ»ν•œλ‹€. 이듀은 ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λŠ” 쀑에 λ°œμƒν•˜λŠ” μ˜ˆμ™Έμ˜ μ§‘ν•©μœΌλ‘œ NullPointerException, IndexOutOfBoundException 등이 이에 μ†ν•œλ‹€.(μ—„λ°€νžˆ λ§ν•˜λ©΄ 이 μ˜ˆμ™Έ ν΄λž˜μŠ€λ“€μ€ Unchecked Exception ν΄λž˜μŠ€λ“€μ΄λ‹€.)

μ΄λ“€μ˜ νŠΉμ§•μ€ λͺ…μ‹œμ μœΌλ‘œ 처리λ₯Ό ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. μ™œλƒν•˜λ©΄ ν•΄λ‹Ή μ˜ˆμ™Έ ν΄λž˜μŠ€λ“€μ€ 컴파일 ν•  λ•Œκ°€ μ•„λ‹Œ μ‹€ν–‰ λ‹¨κ³„μ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έλ“€μ΄κΈ° λ•Œλ¬Έμ΄λ‹€. 즉, throws μ˜ˆμ•½μ–΄λ₯Ό μ΄μš©ν•΄ λ©”μ†Œλ“œμ—μ„œ ν•΄λ‹Ή μ˜ˆμ™Έ λ°œμƒ μ‹œ μ±…μž„ νšŒν”Όλ₯Ό ν•˜μ§€ μ•Šμ•„λ„ 되고, try ~ catch ꡬ문을 톡해 ꡳ이 μ˜ˆμ™Έ λ°œμƒ μ‹œμ— λŒ€ν•œ λŒ€μ•ˆμ±…μ„ μ„Έμš°μ§€ μ•Šμ•„λ„ λœλ‹€λŠ” 말이닀. λ‹€λ§Œ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ„ μ§„ν–‰ν•˜λ©΄μ„œ 자주 λ°œμƒν•˜λŠ” Unchecked Exception에 λŒ€ν•΄ μ μ ˆν•œ λŒ€λΉ„λ₯Ό 해놓지 μ•ŠμœΌλ©΄ μ™„λ²½ν•˜λ‹€κ³  μƒκ°ν•œ μ½”λ“œλΌ 할지라도 μ–Έμ  κ°€λŠ” λ§Œλ‚˜κ²Œ λ˜λ”λΌ.

여기에 μ†ν•˜λŠ” μ˜ˆμ™Έ ν΄λž˜μŠ€λ“€μ€ νŠΈλžœμž­μ…˜ μ‹œ, RollBack을 μˆ˜ν–‰ν•œλ‹€λŠ” 점도 κΈ°μ–΅ν•΄λ†“λŠ” 것이 μ’‹λ‹€.

221126 μˆ˜μ •!
λ°±κΈ°μ„ λ‹˜μ˜ [Effective Java] - Item 2 > IllegalArgumentException μˆ˜μ—…μ„ 듀은 λ’€, 과거에 μž‘μ„±ν•œ λ‚΄μš©μ΄ μ œκ°€ μ•Œκ³  있던 뢀뢄이 잘λͺ»λœ λ‚΄μš©μ΄λΌ 이에 λŒ€ν•΄ μˆ˜μ •ν•©λ‹ˆλ‹€. μ£„μ†‘ν•©λ‹ˆλ‹€.

RuntimeException 이 RollBack 을 μˆ˜ν–‰ν•œλ‹€λŠ” λ‚΄μš©μ€ Spring Framework 의 κΈ°λ³Έ μ„€μ •μœΌλ‘œ ν•΄λ‹Ή Exception 이 μ•„λ‹ˆλ”λΌλ„ κ°œλ°œμžκ°€ μ›ν•˜λŠ” λ°©ν–₯으둜 μ„€μ • κ°€λŠ₯ν•©λ‹ˆλ‹€. λ˜ν•œ, μ—¬λŸ¬ λΈ”λ‘œκ·Έ(μ €λ₯Ό ν¬ν•¨ν•œπŸ˜’)μ—μ„œ 이에 λŒ€ν•΄ μ„€λͺ…ν•  λ•Œ λ“±μž₯ν•˜λŠ” Transaction 의 μ˜λ―ΈλŠ” λͺ…ν™•νžˆ μ–΄λ–€ μ˜λ―ΈμΈμ§€ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€. Database Transaction 인지, Message Queue Transaction 인지 μ•Œ 수 μ—†κΈ° λ•Œλ¬Έμ— μ˜³μ§€ λͺ»ν•œ λ‚΄μš©μž…λ‹ˆλ‹€. 

κ·Έλ ‡λ‹€λ©΄ Spring Framework μ—μ„œλŠ” μ™œ RuntimeException λ°œμƒ μ‹œ 기본적으둜 Transaction 을 RollBack ν•˜λ„λ‘ λ§Œλ“€μ—ˆμ„κΉŒμš”?
μ΄λŠ” RuntimeException κ³Ό 그의 μ„œλΈŒ ν΄λž˜μŠ€λ“€μ€ μ˜ˆμƒ κ°€λŠ₯ν•œ λ²”μœ„μ— μ†ν•˜μ§€ μ•Šμ•„ μ–΄λ– ν•œ κ²½μš°λŠ” λŒ€λΉ„ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆμ–΄ Transaction λ°œμƒ μ‹œ RollBack 을 ν•˜λŠ” 것 μž…λ‹ˆλ‹€.

Checked Exception

ν•΄λ‹Ή μ˜μ—­μ— μ†ν•˜λŠ” μ˜ˆμ™Έ ν΄λž˜μŠ€λŠ” 컴파일 μ‹œμ— λ°œμƒν•˜λŠ” μ˜ˆμ™Έ 클래슀의 μ§‘ν•©μœΌλ‘œ, Runtime Exception 에 μ†ν•œ 클래슀λ₯Ό μ œμ™Έν•œ λͺ¨λ“  Exception 클래슀λ₯Ό λœ»ν•œλ‹€.

여기에 μ†ν•œ λŒ€ν‘œμ μΈ μ˜ˆμ™Έ ν΄λž˜μŠ€λ‘œλŠ” IllegalClassFormatException, SQLException, IOException 등이 μ‘΄μž¬ν•˜λŠ”λ°, 이듀은 try ~ catch κ΅¬μ ˆμ΄λ‚˜ throws μ˜ˆμ•½μ–΄ λ“±μœΌλ‘œ κΌ­ λ©”μ†Œλ“œ λ‹¨μ—μ„œ 처리λ₯Ό ν•΄μ€˜μ•Ό ν•œλ‹€. μ™œλƒν•˜λ©΄ Checked Exception ν΄λž˜μŠ€λ“€μ€ 컴파일 μ‹œμ— λ°œμƒν•˜κΈ°μ— μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•΄μ£Όμ§€ μ•ŠμœΌλ©΄ 컴파일이 λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€.

κ·ΈλŸ¬ν•œ 이유둜 Checked Exception에 μ†ν•œ ν΄λž˜μŠ€λ“€μ€ RollBack을 μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ”λ°, 아직 검색 μ‹€λ ₯의 λΆ€μ‘±κ³Ό μ§€μ‹μ˜ 끈이 μ§§μ•„μ„œ κ·Έ μ΄μœ μ— λŒ€ν•΄ μ •ν™•νžˆ νŒŒμ•…ν•˜μ§€ λͺ»ν–ˆλ‹€. 쑰금 더 찾아보고 ν•΄λ‹Ή λΆ€λΆ„ κ°œμ„ ν•΄μ•Όκ² λ‹€!


πŸ’‍♂️ ν•΄λ‹Ή 뢀뢄에 λŒ€ν•΄ κ³΅λΆ€ν•˜λ‹€ λ³΄λ‹ˆ λ§Žμ€ λΈ”λ‘œκ·Έμ—μ„œ μ˜ˆμ™Έ 처리 μ „λž΅κ³Ό μ—°κ²°λ˜μ–΄ μ„€λͺ…ν•˜κ³  μžˆμ—ˆλŠ”λ°, λŒ€λΆ€λΆ„ ν† λΉ„μ˜ μŠ€ν”„λ§(μ„±κ²½)을 읽고 μž‘μ„±ν•˜μ‹  글이 λŒ€λΆ€λΆ„μ΄μ˜€λ‹€! 쑰금 더 μ„±μž₯ν•˜κ³ , κΈ€λ§Œ 읽어도 μΆ©λΆ„νžˆ 이해가 될 λ•Œ κΌ­ ν† λΉ„μ˜ μŠ€ν”„λ§ λ…μ„œμ— 도전해봐야겠닀!

μ°Έκ³  μ‚¬μ΄νŠΈ

 

Java Platform SE 8

 

docs.oracle.com

 

Checked Exception을 λŒ€ν•˜λŠ” μžμ„Έ - Yun Blog | 기술 λΈ”λ‘œκ·Έ

Checked Exception을 λŒ€ν•˜λŠ” μžμ„Έ - Yun Blog | 기술 λΈ”λ‘œκ·Έ

cheese10yun.github.io

 

Java μ˜ˆμ™Έ(Exception) μ²˜λ¦¬μ— λŒ€ν•œ μž‘μ€ 생각

μΌμƒμƒν™œμ—μ„œλ„ 기본적인 것은 κ³ λ―Όν•˜μ§€ μ•Šκ³  μŠ΅κ΄€μ²˜λŸΌ μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€. μ΄ˆκΈ‰ 개발자인 λ‚˜μ—κ²Œ ‘μ˜ˆμ™Έ(Exception)’이 λ°”λ‘œ 그런 κ²ƒμ΄μ—ˆλ‹€. 처음 JAVAμˆ˜μ—… λ•Œ κ°•μ‚¬λ‹˜κ»˜ "μ™œ λ‘œμ§μ„ try문으둜

www.nextree.co.kr

'Programming > Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

F008 - Garbage Collector  (2) 2021.05.16
F007 - JVM : Memory Architecture  (0) 2021.05.14
F005 - Stack & Heap Memory  (0) 2021.05.08
F004 - Reference Type  (0) 2021.05.08
F003 - Access Modifier  (0) 2021.05.06