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

2022. 4. 30. 23:17ㆍJAVA/μžλ°”μ˜ 정석

728x90

1️⃣ ν”„λ‘œκ·Έλž¨ 였λ₯˜ 

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

 

이λ₯Ό λ°œμƒμ‹œμ μ— 따라 컴파일 μ—λŸ¬ 와 λŸ°νƒ€μž„ μ—λŸ¬λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€. 

컴파일 μ—λŸ¬λŠ” 컴파일 ν•  λ•Œ λ°œμƒν•˜λŠ” μ—λŸ¬μ΄κ³ , ν”„λ‘œκ·Έλž¨ 싀행도쀑에 λ°œμƒν•˜λŠ” μ—λŸ¬λ₯Ό λŸ°νƒ€μž„ μ—λŸ¬λΌκ³  ν•œλ‹€, 

이외에도 논리적 μ—λŸ¬κ°€ μžˆλŠ”λ° μ»΄νŒŒμΌλ„ 잘 되고, 싀행도 잘 λ˜μ§€λ§Œ μ˜λ„ν•œ 것과 λ‹€λ₯΄κ²Œ λ™μž‘ν•˜λŠ” 것을 λ§ν•œλ‹€. 

 

- 컴파일 μ—λŸ¬ : 컴파일 μ‹œμ— λ°œμƒν•˜λŠ” μ—λŸ¬ 
- λŸ°νƒ€μž„ μ—λŸ¬ : μ‹€ν–‰ μ‹œμ— λ°œμƒν•˜λŠ” μ—λŸ¬ 
- 논리적 μ—λŸ¬ : 싀행은 λ˜μ§€λ§Œ μ˜λ„μ™€ λ‹€λ₯΄κ²Œ λ™μž‘ν•˜λŠ” 것 

μ†ŒμŠ€μ½”λ“œλ₯Ό μ»΄νŒŒμΌν•˜λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ μ†ŒμŠ€ μ½”λ“œ(*.java)에 λŒ€ν•΄ μ˜€νƒ€λ‚˜ 잘λͺ»λœ ꡬ문, μžλ£Œν˜• 체크 λ“±μ˜ 기본적인 검사λ₯Ό μˆ˜ν–‰ν•˜μ—¬ 였λ₯˜κ°€ μžˆλŠ”μ§€λ₯Ό μ•Œλ €μ€€λ‹€. 

μ»΄νŒŒμΌλŸ¬κ°€ μ•Œλ €μ€€ μ—λŸ¬λ“€μ„ λͺ¨λ‘ μˆ˜μ •ν•΄μ„œ μ»΄νŒŒμΌμ„ μ„±κ³΅μ μœΌλ‘œ 마치고 λ‚˜λ©΄, 클래슀 파일(*.class) 이 μƒμ„±λ˜κ³ , μƒμ„±λœ 클래슀 νŒŒμΌμ„ μ‹€ν–‰ν•  수 있게 λ˜λŠ” 것이닀. 

 

ν•˜μ§€λ§Œ μ»΄νŒŒμΌμ„ μ—λŸ¬μ—†μ΄ μ„±κ³΅μ μœΌλ‘œ λ§ˆμ³£λ‹€κ³  ν•΄μ„œ ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ μ‹œμ—λ„ μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ” 것은 μ•„λ‹ˆλ‹€. 

μ»΄νŒŒμΌλŸ¬κ°€ μ†ŒμŠ€ μ½”λ“œμ˜ 기본적인 사항은 컴파일 μ‹œμ— λͺ¨λ‘ 걸러 쀄 μˆ˜λŠ” μžˆμ§€λ§Œ, μ‹€ν–‰ 도쀑에 λ°œμƒν•  수 μžˆλŠ” 잠재적인 였λ₯˜κΉŒμ§€ 검사할 수 μ—†κΈ° λ•Œλ¬Έμ— μ»΄νŒŒμΌμ€ μž˜λ˜μ—ˆμ–΄λ„ μ‹€ν–‰ 쀑에 μ—λŸ¬μ— μ˜ν•΄μ„œ 잘λͺ»λœ κ²°κ³Όλ₯Ό μ–»κ±°λ‚˜ ν”„λ‘œκ·Έλž¨μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ  수 μžˆλ‹€. 

 

μžλ°”μ—μ„œλŠ” μ‹€ν–‰ μ‹œ(runtime) μ‹œ λ°œμƒν•  수 μžˆλŠ” ν”„λ‘œκ·Έλž¨ 였λ₯˜λ₯Ό 'μ—λŸ¬Error' 와 'μ˜ˆμ™ΈException' λ‘κ°€μ§€λ‘œ κ΅¬λΆ„ν•œλ‹€. 

- μ—λŸ¬ Error :  ν”„λ‘œκ·Έλž¨ μ½”λ“œμ— μ˜ν•΄μ„œ 수슡될 수 μ—†λŠ” μ‹¬κ°ν•œ 였λ₯˜ 
- μ˜ˆμ™Έ Exception :  ν”„λ‘œκ·Έλž¨ μ½”λ“œμ— μ˜ν•΄μ„œ 수슡될 수 μžˆλŠ” λ‹€μ†Œ λ―Έμ•½ν•œ 였λ₯˜ 

μ—λŸ¬λŠ” λ©”λͺ¨λ¦¬ λΆ€μ‘± OutOfMemoryError λ‚˜ μŠ€νƒμ˜€λ²„ν”Œλ‘œμš° StackOverFlowError 와 같이 일단 λ°œμƒν•˜λ©΄ 볡ꡬ할 수 μ—†λŠ” μ‹¬κ°ν•œ 였λ₯˜μ΄κ³  μ˜ˆμ™ΈλŠ” λ°œμƒν•˜λ”λΌλ„ 수슡될 수 μžˆλŠ” 비ꡐ적 덜 μ‹¬κ°ν•œ 였λ₯˜μ΄λ‹€. 

 

 

그리고 μ˜ˆμ™Έ ν΄λž˜μŠ€λŠ” RuntimeException ν΄λž˜μŠ€μ™€ Exceptionν΄λž˜μŠ€λ“€λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€. 

RuntimeException ν΄λž˜μŠ€λ“€μ€ 주둜 ν”„λ‘œκ·Έλž˜λ¨Έ μ‹€μˆ˜μ— μ˜ν•΄μ„œ λ°œμƒλ  수 μžˆλŠ” μ˜ˆμ™Έλ‘œ μžλ°”μ˜ ν”„λ‘œκ·Έλž˜λ° μš”μ†Œλ“€κ³Ό 관계가 μžˆλ‹€. 

ex) λ°°μ—΄μ˜ λ²”μœ„λ₯Ό 벗어남 ArrayIndexOutBoundsException 

      값이 null인 μ°Έμ‘°λ³€μˆ˜μ˜ 멀버λ₯Ό ν˜ΈμΆœν•˜λ €κ³  함 NullPointerException 

      ν΄λž˜μŠ€κ°„μ˜ ν˜•λ³€ν™˜μ„ 잘λͺ»ν•¨ ClassCastException 

      μ •μˆ˜λ₯Ό 0으둜 λ‚˜λˆ„λ €κ³  함 ArithmeticException 

 

Exception ν΄λž˜μŠ€λ“€μ€ 주둜 μ™ΈλΆ€μ˜ 영ν–₯으둜 λ°œμƒν•  수 μžˆλŠ” κ²ƒλ“€λ‘œμ„œ, ν”„λ‘œκ·Έλž¨μ˜ μ‚¬μš©μžλ“€μ΄ λ™μž‘μ— μ˜ν•΄μ„œ λ°œμƒν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€. 

ex) μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 파일의 이름 μž…λ ₯ FileNotFoundException 

       μ‹€μˆ˜λ‘œ 클래슀의 이름을 잘λͺ» 적음 ClassNotFoundException 

       μž…λ ₯ν•œ 데이터 ν˜•μ‹μ΄ 잘λͺ»λœ DataFormatException 

 

 

2️⃣ μ˜ˆμ™Έ μ²˜λ¦¬ν•˜κΈ° try-catch λ¬Έ 

ν”„λ‘œκ·Έλž¨μ˜ 싀행도쀑에 λ°œμƒν•˜λŠ” μ—λŸ¬λŠ” μ–΄μ©” 수 μ—†μ§€λ§Œ, μ˜ˆμ™ΈλŠ” ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 이에 λŒ€ν•œ 처리λ₯Ό 미리 ν•΄μ£Όμ–΄μ•Όν•œλ‹€. 

 

μ˜ˆμ™Έ μ²˜λ¦¬λž€ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œ λ°œμƒν•  수 μžˆλŠ” 예기치 λͺ»ν•œ μ˜ˆμ™Έμ˜ λ°œμƒμ— λŒ€λΉ„ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것이며, μ˜ˆμ™Έ 처리의 λͺ©μ μ€ μ˜ˆμ™Έμ˜ λ°œμƒμœΌλ‘œ μΈν•œ μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨μ˜ κ°‘μž‘μŠ€λŸ° 비정상 μ’…λ£Œλ₯Ό 막고, 정상적인 μ‹€ν–‰μƒνƒœλ₯Ό μœ μ§€ν•  수 μžˆλ„λ‘ ν•˜λŠ” 것이닀. 

 

μ˜ˆμ™Έμ²˜λ¦¬ 
μ •μ˜ : ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œ λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έμ— λŒ€λΉ„ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것 
λͺ©μ  : ν”„λ‘œκ·Έλž¨μ˜ 비정상 μ’…λ£Œλ₯Ό 막고, 정상적인 μ‹€ν–‰μƒνƒœλ₯Ό μœ μ§€ν•˜λŠ” 것 

 

μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” try~catch 문을 μ‚¬μš©ν•œλ‹€. 

ν•˜λ‚˜μ˜ try λΈ”λŸ­ λ‹€μŒμ—λŠ” μ—¬λŸ¬ μ’…λ₯˜μ˜ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν•˜λ‚˜ μ΄μƒμ˜ catch λΈ”λŸ­μ΄ 올 수 있으며, 이 쀑 λ°œμƒν•œ μ˜ˆμ™Έμ˜ μ’…λ₯˜μ™€ μΌμΉ˜ν•˜λŠ” 단 ν•œκ°œμ˜ catch λΈ”λŸ­λ§Œ μˆ˜ν–‰λœλ‹€. 

 

 

- tryλΈ”λŸ­ λ‚΄μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•œ 경우

1. λ°œμƒν•œ μ˜ˆμ™Έμ™€ μΌμΉ˜ν•˜λŠ” catch λΈ”λŸ­μ΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. 

2. μΌμΉ˜ν•˜λŠ” catch λΈ”λŸ­μ„ 찾게되면, κ·Έ catch λΈ”λŸ­ λ‚΄μ˜ λ¬Έμž₯듀을 μˆ˜ν–‰ν•˜κ³  전체 try~catch문을 λΉ μ Έλ‚˜κ°€μ„œ κ·Έ λ‹€μŒ λ¬Έμž₯을 κ³„μ†ν•΄μ„œ μˆ˜ν–‰ν•œλ‹€. 만일 μΌμΉ˜ν•˜λŠ” catch λΈ”λŸ­μ„ 찾지 λͺ»ν•˜λ©΄ μ˜ˆμ™ΈλŠ” μ²˜λ¦¬λ˜μ§€ λͺ»ν•œλ‹€. 

 

- try λΈ”λŸ­ λ‚΄μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ€ 경우 

1. catch λΈ”λŸ­μ„ κ±°μΉ˜μ§€ μ•Šκ³  전체 try ~ catch 문을 λΉ μ Έλ‚˜κ°€μ„œ μˆ˜ν–‰μ„ κ³„μ†ν•œλ‹€. 

 

 

try λΈ”λŸ­μ—μ„œ ArithmeticException 이 λ°œμƒν•˜μ˜€κΈ° λ•Œλ¬Έμ— catch λΈ”λŸ­μ„ ν•˜λ‚˜μ”© μ°¨λ‘€λ‘œ κ²€μ‚¬ν•˜κ²Œ λ˜λŠ”λ° 첫번째 κ²€μ‚¬μ—μ„œ μΌμΉ˜ν•˜λŠ” catch λΈ”λŸ­μ„ μ°Ύμ•˜κΈ° λ•Œλ¬Έμ— λ‘λ²ˆμ§Έ catch λΈ”λŸ­μ€ κ²€μ‚¬ν•˜μ§€ μ•Šκ²Œ λœλ‹€. 

만일 try λΈ”λŸ­ λ‚΄μ—μ„œ ArithmeticException 이 μ•„λ‹Œ λ‹€λ₯Έ μ’…λ₯˜μ˜ μ˜ˆμ™Έκ°€ λ°œμƒν•œ κ²½μš°μ—λŠ” λ‘λ²ˆμ§Έ catch λΈ”λŸ­μΈ Exception 클래슀 νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ₯Ό μ„ μ–Έν•œ κ³³μ—μ„œ μ²˜λ¦¬λ˜μ—ˆμ„ 것이닀. 

 

 

 

3️⃣ printStackTrace() 와 getMessage()

μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ μƒμ„±λ˜λŠ” μ˜ˆμ™Έ 클래슀의 μΈμŠ€ν„΄μŠ€μ—λŠ” λ°œμƒν•œ μ˜ˆμ™Έμ— λŒ€ν•œ 정보가 담겨 있으며, getMessage() 와 printStackTrace()을 ν†΅ν•΄μ„œ 이 정보듀을 얻을 수 μžˆλ‹€. 

 

printStackTrace() : μ˜ˆμ™Έ λ°œμƒ λ‹Ήμ‹œμ˜ 호좜 μŠ€νƒμ— μžˆμ—ˆλ˜ λ©”μ„œλ“œμ˜ 정보와 μ˜ˆμ™Έ λ©”μ‹œμ§€λ₯Ό 화면에 좜λ ₯ν•œλ‹€. 
getMessage() :  λ°œμƒν•œ μ˜ˆμ™Έν΄λž˜μŠ€μ˜ μΈμŠ€ν„΄μŠ€μ— μ €μž₯된 λ©”μ‹œμ§€λ₯Ό 얻을 수 μžˆλ‹€. 

-> ArtimeticException μΈμŠ€ν„΄μŠ€μ˜ printStackTrace()λ₯Ό μ‚¬μš©ν•΄μ„œ 호좜 μŠ€νƒμ— λŒ€ν•œ 정보와 μ˜ˆμ™Έ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν–ˆλ‹€. 

try~catch문으둜 μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜μ—¬ μ˜ˆμ™Έκ°€ λ°œμƒν•΄λ„ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œν•˜μ§€ μ•Šλ„λ‘ ν•΄μ£ΌλŠ” λ™μ‹œμ— printStackTrace() λ˜λŠ” getMessage() 와 같은 λ©”μ„œλ“œλ₯Ό ν†΅ν•΄μ„œ μ˜ˆμ™Έμ˜ λ°œμƒ 원인을 μ•Œ 수 μžˆλ‹€. 

 

 

 

λ©€ν‹° catchλΈ”λŸ­

jdk1.7λΆ€ν„° μ—¬λŸ¬ catchλΈ”λŸ­μ„ '|' 기호λ₯Ό μ‚¬μš©ν•΄μ„œ ν•˜λ‚˜μ˜ catch λΈ”λŸ­μœΌλ‘œ ν•©μΉ  수 있게 λ˜μ—ˆλ‹€. 

 

try {

     ...

} catch(ExceptionA | Exception B e) {

    e.printStackTrace();

}

 

참고둜 μ°Έμ‘°λ³€μˆ˜ e둜 λ©€ν‹° catch λΈ”λŸ­μ— '|' 기호둜 μ—°κ²°λœ μ˜ˆμ™Έ ν΄λž˜μŠ€λ“€μ˜ 곡톡 λΆ„λͺ¨μΈ 쑰상 μ˜ˆμ™Έ ν΄λž˜μŠ€μ— μ„ μ–Έλœ λ©€λ²„λ§Œ μ‚¬μš©ν•  수 μžˆλ‹€. 

 

 

 

 

 

 

 

 

 

 

 

 

728x90