πŸ’» BackEnd/🟨 Java

🟨 [Java] Exception(μ˜ˆμ™Έ 처리)

Dbswnstjd 2023. 4. 19. 11:49

μžλ°”μ˜ μ˜ˆμ™Έ 처리(Exception Handling)


μžλ°”μ—μ„œ μ˜ˆμ™Έ(exception)μ΄λž€ μ‚¬μš©μžμ˜ 잘λͺ»λœ μ‘°μž‘μ΄λ‚˜ 개발자의 μ½”λ”© μ‹€μˆ˜λ‘œ 인해 λ°œμƒν•˜λŠ” ν”„λ‘œκ·Έλž¨ 였λ₯˜λ₯Ό λ§ν•œλ‹€. μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ€ κ³§λ°”λ‘œ μ’…λ£Œλ˜κΈ° λ•Œλ¬Έμ— μ—λŸ¬μ™€ λ™μΌν•˜λ‚˜, μ˜ˆμ™ΈλŠ” μ˜ˆμ™Έ 처리λ₯Ό 톡해 ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•˜μ§€ μ•Šκ³  정상 μ‹€ν–‰ μƒνƒœκ°€ μœ μ§€λ˜λ„λ‘ ν•  수 μžˆλ‹€.

 

μžλ°”μ˜ μ˜ˆμ™Έμ—λŠ” 일반 μ˜ˆμ™Έμ™€ μ‹€ν–‰ μ˜ˆμ™Έκ°€ μžˆλ‹€. 일반 μ˜ˆμ™ΈλŠ” Checked Exception, μ‹€ν–‰ μ˜ˆμ™ΈλŠ” Unchecked Exception 이라고 λΆ€λ₯Έλ‹€.

일반 μ˜ˆμ™Έ(Checked Exception)λŠ” λ°˜λ“œμ‹œ κ°œλ°œμžκ°€ μ˜ˆμ™Έ 처리λ₯Ό 직접 진행해야 ν•œλ‹€.

반면 μ‹€ν–‰ μ˜ˆμ™Έ(Unchecked Exception)은 κ°œλ°œμžκ°€ 처리λ₯Ό ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. 


μ‹€ν–‰ μ˜ˆμ™Έ(Unchecked Exception)의 μ’…λ₯˜


RuntimeException의 μžμ‹ ν΄λž˜μŠ€λ“€ λͺ¨λ‘ 포함, Unchecked Exception이닀.
try-catch문으둜 μ˜ˆμ™Έ 처리λ₯Ό 직접 ν•˜κΈ°λ³΄λ‹€λŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•ŠλŒκ³  ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

1-1. NullPointerException(java.lang.NullPointerException)

객체 μ°Έμ‘°κ°€ μ—†λŠ” μƒνƒœμΌ λ•Œ λ°œμƒν•œλ‹€. null 값을 κ°–λŠ” μ°Έμ‘° λ³€μˆ˜λ‘œ 객체 μ ‘κ·Ό μ—°μ‚°μžμΈ λ„νŠΈ(.)λ₯Ό μ‚¬μš©ν•˜μ˜€μ„ λ•Œ λ°œμƒν•œλ‹€.

 

1-2. ArrayIndexOutOfBoundsException

λ°°μ—΄μ—μ„œ 인덱슀 λ²”μœ„λ₯Ό μ΄ˆκ³Όν•˜μ—¬ μ‚¬μš©ν•  λ•Œ λ°œμƒν•œλ‹€.

 

1-3. NumberFormatException 

λ¬Έμžμ—΄λ‘œ λ˜μ–΄ μžˆλŠ” 데이터λ₯Ό 숫자둜 λ³€κ²½ν•˜λŠ” κ²½μš°κ°€ μžˆλŠ”λ°, λ¬Έμžμ—΄μ„ 숫자둜 λ³€ν™˜ν•˜λŠ” λ©”μ„œλ“œλ₯Ό Integer.parseInt(String s)이닀. ν•˜μ§€λ§Œ λ§€κ°œλ³€μˆ˜κ°€ 숫자둜 λ³€ν™˜λ  수 μ—†λ‹€λ©΄ java.lang.NumberFormatException을 λ°œμƒμ‹œκΈ΄λ‹€. 

 

1-4. ClassCastException 

ν—ˆμš©λ˜μ§€ μ•ŠλŠ”λ° μ–΅μ§€λ‘œ νƒ€μž… λ³€ν™˜μ„ μ‹œλ„ν•  경우 λ°œμƒν•œλ‹€.

μΆ”μƒν΄λž˜μŠ€ Animal을 μƒμ†ν•˜λŠ” Dog, Cat ν΄λž˜μŠ€μ™€ RemoteControl μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†ν•˜λŠ” Television, Audio ν΄λž˜μŠ€κ°€ μžˆλ‹€κ³  κ°€μ •ν•˜λ©΄ μ•„λž˜ μ½”λ“œμ™€ κ°™λ‹€.

Animal animal = new Dog();
Dog dog = (Dog) animal; // 문제 μ—†μŒ

RemotControl ex1 = new Television();
Television ex2 = (Television) ex1; // 문제 μ—†μŒ

Animal animal = new Animal();
Dog dog = (Dog) animal; // ClassCastException λ°œμƒ

μ˜ˆμ™Έ 처리 μ½”λ“œ (try - catch - finally)

μ˜ˆμ™Έ 처리λ₯Ό ν•˜λŠ” μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™λ‹€.

try{
///μ˜ˆμ™Έκ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” μ½”λ“œ
.... ......... ;
.............. .. ; << 1. μ—¬κΈ°μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ
.............. .... ; << 2. μ˜ˆμ™Έ λ°œμƒν•œ κ³³ μ•„λž˜λŠ” μ‹€ν–‰ν•˜μ§€ μ•Šκ³ ,
}
catch(μ˜ˆμ™Έν΄λž˜μŠ€ e) {
   μ˜ˆμ™Έ 처리; << 3. catchλ¬Έμ—μ„œ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•œλ‹€.
}
finally {
///무슨 일이 μžˆλ“  항상 μ‹€ν–‰
}

 


닀쀑 catch λ¬Έ

.....
try{
// μ˜ˆμ™Έ 1 λ°œμƒμœ„μΉ˜
// μ˜ˆμ™Έ 2 λ°œμƒμœ„μΉ˜
}
catch(μ˜ˆμ™Έ1을 μž‘λŠ” κ³³){
}
catch(μ˜ˆμ™Έ2λ₯Ό μž‘λŠ” κ³³){
}

μ˜ˆμ™Έλ³„λ‘œ 닀쀑 catch문을 ꡬ성할 수 μžˆμ§€λ§Œ μœ„μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ μ•„λž˜μ˜ catchλŠ” μ‹€ν–‰ν•˜μ§€ μ•ŠλŠ”λ‹€.

λ”°λΌμ„œ catch 블둝을 μž‘μ„±ν•  λ•Œμ—λŠ” μƒμœ„ μ˜ˆμ™Έ ν΄λž˜μŠ€κ°€ ν•˜μœ„ μ˜ˆμ™Έ ν΄λž˜μŠ€λ³΄λ‹€ 밑에 μœ„μΉ˜ν•˜λ„λ‘ μž‘μ„±ν•΄μ•Όν•œλ‹€.

κ·Έ μ΄μœ λŠ” tryμ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ catch 블둝이 μž‘μ„±λœ μˆœμ„œλŒ€λ‘œ μœ„μ—μ„œ μ•„λž˜λŒ€λ‘œ μ°¨λ‘€λ‘œ κ²€μ‚¬ν•˜λŠ”λ°, λ§Œμ•½ μƒμœ„ μ˜ˆμ™Έ ν΄λž˜μŠ€κ°€ 더 μœ„μ— μžˆμ—ˆλ‹€λ©΄ ν•˜μœ„ μ˜ˆμ™Έ 클래슀λ₯Ό μ‹€ν–‰ν•˜μ§€ μ•Šκ²Œ λœλ‹€.

즉, ν•˜μœ„ μ˜ˆμ™Έ ν΄λž˜μŠ€κ°€ μƒμœ„ μ˜ˆμ™Έ 클래슀λ₯Ό μƒμ†ν–ˆκΈ° λ•Œλ¬Έμ—, μƒμœ„ μ˜ˆμ™Έ 클래슀λ₯Ό μž‘λŠ” catch 블둝이 μ‹€ν–‰λ˜κ²Œ λœλ‹€. 

.....
try{
// FileNotFoundException μ˜ˆμ™Έ λ°œμƒ
}
catch(Exception e){
    // FileNotFoundException은 Exception의 μžμ‹ ν΄λž˜μŠ€μ΄λ―€λ‘œ 이 λΆ€λΆ„μ˜ catchκ°€ 싀행됨
}
catch(FileNotFoundException e){
    // μ •μž‘ FileNotFoundException을 μ²˜λ¦¬ν•˜λ €λŠ” 이 catch 블둝은 μ‹€ν–‰λ˜μ§€ μ•ŠμŒ
}

μœ„μ˜ μ½”λ“œλ₯Ό 보면 FileNotFoundException은 Exception 클래슀λ₯Ό μƒμ†ν•˜μ˜€κΈ° λ•Œλ¬Έμ— catch에 걸리게 되면 μ•„λž˜μ˜ catch 문은 μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€. 

κ·ΈλŸ¬λ―€λ‘œ catch μœ„μΉ˜λ₯Ό λ°”κΎΈμ–΄ μ£Όλ©΄λœλ‹€. 

.....
try{
// FileNotFoundException μ˜ˆμ™Έ λ°œμƒ
}
catch(FileNotFoundException e){
  	// Exception 
 }
catch(Exception e){
    // FileNotFoundException 이 μ‹€ν–‰λ˜κ³  μ‹€ν–‰
}

 


λ©€ν‹° catch

μžλ°” 8 λΆ€ν„° ν•˜λ‚˜μ˜ catch λΈ”λ‘μ—μ„œ μ—¬λŸ¬ 개의 μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•  수 μžˆλŠ” κΈ°λŠ₯이 생겼닀. 

try{
  // μ˜ˆμ™Έ 1 λ°œμƒμœ„μΉ˜ (ν˜Ήμ€ μ˜ˆμ™Έ 3 λ°œμƒμœ„μΉ˜)
  // μ˜ˆμ™Έ 2 λ°œμƒμœ„μΉ˜
}
catch( μ˜ˆμ™Έ 1 | μ˜ˆμ™Έ 3  e) // | λŠ” or 둜 보면 λœλ‹€. μ˜ˆμ™Έ 1 ν˜Ήμ€ μ˜ˆμ™Έ 3이 λ°œμƒν•˜λ©΄
ν•΄λ‹Ήν•œ catch λΈ”λ‘μ—μ„œ μ²˜λ¦¬ν•˜κ²Œ λœλ‹€.
{
  μ˜ˆμ™Έ 처리
}
catch( μ˜ˆμ™Έ2 e)
{
  μ˜ˆμ™Έ 처리
}