Skip to content

Latest commit

Β 

History

History
executable file
Β·
106 lines (70 loc) Β· 6.36 KB

File metadata and controls

executable file
Β·
106 lines (70 loc) Β· 6.36 KB

μ˜ˆμ™Έμ²˜λ¦¬(Exception handling)

ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  λ•Œ 문법에 λ§žμ§€ μ•Šκ²Œ μž‘μ„±ν•˜κ³  μ»΄νŒŒμΌν•˜κ±°λ‚˜ λ˜λŠ” μ–΄λ–€ 원인에 μ˜ν•΄μ„œ μ˜ˆμƒμΉ˜ λͺ»ν•œ μ—λŸ¬κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ˜λ„ν•˜μ§€ μ•Šμ€ 상황에 λŒ€ν•΄μ„œ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ˜ˆμ™Έ(Exception)λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

μ˜ˆμ™Έ(exception)λŠ” μ—λŸ¬κ°€ λ°œμƒν•˜μ—¬ 싀행쀑인 ν”„λ‘œκ·Έλž¨μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ§€λ§Œ λ‹€μŒκ³Ό 같은 예츑 κ°€λŠ₯ν•˜μ—¬ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ 섀계할 수 μžˆλŠ” 것을 λ§ν•˜λ©°, μžλ°”μ—μ„œλŠ” try-catch문을 ν†΅ν•΄μ„œ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•  수 μžˆλŠ” 문법이 μ‘΄μž¬ν•©λ‹ˆλ‹€.

  • μ‚¬μš©μžμ˜ μž…λ ₯였λ₯˜
  • λ„€νŠΈμ›Œν¬ μ—°κ²° λŠκΉ€
  • λ©”λͺ¨λ¦¬ λΆ€μ‘±

1. λ°œμƒμ‹œμ μ— λ”°λ₯Έ μ—λŸ¬

μ—λŸ¬λŠ” λ°œμƒ μ‹œμ μ— λ”°λΌμ„œ 크게 3κ°€μ§€λ‘œ λ‚˜λˆŒ 수 μžˆμŠ΅λ‹ˆλ‹€.

  • 컴파일 μ—λŸ¬(Compile-time Error)
  • λŸ°νƒ€μž„ μ—λŸ¬(Runtime Error)
  • 논리적 μ—λŸ¬(Logical Error)

1. 컴파일 μ—λŸ¬

컴파일 μ—λŸ¬λŠ” 말 κ·ΈλŒ€λ‘œ μ†ŒμŠ€μ½”λ“œ(*.java)λ₯Ό 컴파일 ν•  λ•Œ λ°œμƒν•˜λŠ” μ—λŸ¬λ‘œ μ˜€νƒ€ ν˜Ήμ€ λ¬Έλ²•μ μœΌλ‘œ 잘λͺ»λœ(μ„Έλ―Έμ½œλ‘  μƒλž΅, 잘λͺ»λœ μžλ£Œν˜• λ“±) ꡬ문듀, 보톡 문법적인 문제λ₯Ό κ°€λ¦¬ν‚€λŠ” μ—μ„œ μ—λŸ¬κ°€ μžˆμ„ λ•Œ λ°œμƒν•©λ‹ˆλ‹€. 컴파일 μ—λŸ¬λ₯Ό μ‹ νƒμŠ€ μ—λŸ¬(Syntax Error)라고 λΆ€λ₯΄κΈ°λ„ ν•©λ‹ˆλ‹€.

컴파일 μ—λŸ¬λŠ” μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ 였λ₯˜λ₯Ό κ°μ§€ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ μ•Œλ €μ€λ‹ˆλ‹€. 보톡 IDEμ—μ„œ μž…λ ₯ν•˜λ‹€κ°€ κ΅¬λ¬Έμ—λŸ¬κ°€ 발견되면 μ¦‰μ‹œ λΉ¨κ°„μ€„λ‘œ κ·Έμ–΄ μ‚¬μš©μžμ—κ²Œ 미리 μ•Œλ €μ£ΌκΈ° λ•Œλ¬Έμ— λ°œκ²¬ν•˜κΈ°λ„ 쉽고 사전에 λ°©μ§€ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이 과정을 κ±°μ³μ„œ 컴파일 μ‹œ 컴파일 μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•Šκ³  μ„±κ³΅μ μœΌλ‘œ μˆ˜ν–‰μ„ 마치면 μ†ŒμŠ€μ½”λ“œνŒŒμΌμ€ 컴파일러λ₯Ό 톡해 클래슀(*.class)νŒŒμΌμ„ μƒμ„±ν•˜κ³  μ‹€ν–‰ν•  수 있게 λ©λ‹ˆλ‹€.

2. λŸ°νƒ€μž„ μ—λŸ¬

λŸ°νƒ€μž„ μ—λŸ¬λŠ” ν”„λ‘œκ·Έλž¨μ΄ 싀행도쀑 λ°œμƒν•˜λŠ” μ—λŸ¬λ₯Ό λ§ν•©λ‹ˆλ‹€. 보톡 μ‹€ν–‰ 쀑에 μ–΄λ–€ 원인에 μ˜ν•΄ 잘λͺ»λœ 결과값을 μ–»κ±°λ‚˜ 비정상적인 μ’…λ£Œ, ν˜Ήμ€ λ©ˆμΆ˜μƒνƒœμ˜ 지속 λ“±μ˜ κ²½μš°κ°€ λŸ°νƒ€μž„ μ—λŸ¬μ— ν•΄λ‹Ήν•©λ‹ˆλ‹€.

public static void main(String[] args) {
	System.out.println(2 % 0);
}
/* ====== result ======
Exception in thread "main" java.lang.ArithmeticException: / by zero
======================= */

λŸ°νƒ€μž„μ—λŸ¬λŠ” μœ„μ˜ μ˜ˆμ œμ™€ 같이 λ¬Έλ²•μƒμ˜ μ—λŸ¬λŠ” μ—†μ§€λ§Œ 컴퓨터가 더이상 ν•΄λ‹Ή ꡬ문을 μˆ˜ν–‰ν•  수 μ—†μ–΄ ν”„λ‘œκ·Έλž¨μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜κ³  μ—λŸ¬λ©”μ„Έμ§€λ₯Ό λ„μ›Œμ€λ‹ˆλ‹€. μœ„μ˜ μ˜ˆμ œμ—μ„œλŠ” ArithmeticException이 λ°œμƒν•œ 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

λŸ°νƒ€μž„ μ—λŸ¬λŠ” ν”„λ‘œκ·Έλž¨μ΄ 싀행될 λ•Œ JVMμ—μ„œ κ°μ§€λ˜λ©° λ©”λͺ¨λ¦¬ λΆ€μ‘±(OutOfMemoryError)μ΄λ‚˜ μŠ€νƒμ˜€λ²„ν”Œλ‘œμš°(StackOverflowError) λ“± λ°œμƒν•˜λ©΄ 볡ꡬ할 수 μ—†λŠ” 것을 μ—λŸ¬, 그리고 μ˜ˆμ™Έν˜„μƒμ„ μ˜ˆμΈ‘ν•˜κ³  λŒ€μ‘μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλŠ” 비ꡐ적 덜 μ‹¬κ°ν•œ μ—λŸ¬λ₯Ό μ˜ˆμ™ΈλΌκ³  ν•©λ‹ˆλ‹€.

2. μ˜ˆμ™Έ 클래슀의 계측ꡬ쑰

μžλ°”μ—μ„œλŠ” μ˜ˆμ™Έμ™€ 였λ₯˜λ₯Ό 클래슀둜 μ •μ˜ν•΄λ‘μ—ˆμŠ΅λ‹ˆλ‹€. μžλ°”λŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ ν΄λž˜μŠ€μ—μ„œ μΈμŠ€ν„΄μŠ€ν™”λ₯Ό 톡해 μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό μ§„ν–‰ν•©λ‹ˆλ‹€.

μœ„μ˜ 그림은 μ˜ˆμ™Έ 클래슀의 상속 계측도 μž…λ‹ˆλ‹€. μ˜ˆμ™Έ(Exception)의 μ΅œμƒμœ„ ν΄λž˜μŠ€λŠ” Exception클래슀 인 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ μ˜ˆμ™Έμ˜ μ΅œμƒμœ„ 클래슀 Exceptionν΄λž˜μŠ€λŠ” RuntimeExceptionκ³Ό λ‹€λ₯Έ 일반 μ˜ˆμ™Έ ν΄λž˜μŠ€λ“€μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€.

1. 일반 μ˜ˆμ™Έ 클래슀(Exception)

일반 μ˜ˆμ™Έ ν΄λž˜μŠ€λŠ” 주둜 μ™ΈλΆ€μ˜ 영ν–₯으둜 λ°œμƒν•  수 μžˆλŠ” 였λ₯˜λ“€λ‘œ 보톡 μ‚¬μš©μžμ— μ˜ν•΄μ„œ λ°œμƒν•˜λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€. 예λ₯Όλ“€μ–΄

  • 잘λͺ»λœ 클래슀λͺ…(ClassNotFoundException)
  • 잘λͺ»λœ 데이터 μž…λ ₯ ν˜•μ‹(DataFormatException)
  • μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 파일 호좜(FileNotFoundException) 등이 μ‘΄μž¬ν•©λ‹ˆλ‹€.

2. μ‹€ν–‰ μ˜ˆμ™Έ 클래슀(Runtime Exception)

μ‹€ν–‰ μ˜ˆμ™Έ ν΄λž˜μŠ€μ—λŠ” 주둜 개발자의 μ‹€μˆ˜μ— μ˜ν•΄μ„œ λ°œμƒλ  수 μžˆλŠ” μ˜ˆμ™Έλ“€λ‘œ μžλ°” 문법 μš”μ†Œμ™€ κ΄€λ ¨λœ 였λ₯˜λ“€μ΄ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄

  • ν΄λž˜μŠ€κ°„μ˜ ν˜•λ³€ν™˜ 였λ₯˜(ClassCastException)
  • λ²—μ–΄λ‚œ λ°°μ—΄ λ²”μœ„ μ§€μ •(ArrayIndexOutOfBoundsException)
  • 값이 Null인 μ°Έμ‘°λ³€μˆ˜μ˜ 호좜(NullPointerException)
  • μ •μˆ˜λ₯Ό 0으둜 λ‚˜λˆ”(ArithmeticException) 등이 μ‹€ν–‰ μ˜ˆμ™Έ ν΄λž˜μŠ€μ— μ†ν•©λ‹ˆλ‹€.

3. try - catch문

μ•žμ„œ μ˜ˆμ™ΈλŠ” κ°œλ°œμžκ°€ 예츑이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— λ°œμƒν•œ μ˜ˆμ™Έμ— λŒ€ν•΄ μ²˜λ¦¬ν•˜λŠ” μ½”λ“œ μž‘μ„±μ„ 미리 ν•΄ 쀄 수 μžˆλ‹€κ³  ν–ˆμŠ΅λ‹ˆλ‹€. μžλ°”μ—μ„œλŠ” μ˜ˆμ™Έ 처리λ₯Ό μœ„ν•œ μ½”λ“œ μž‘μ„±μ„ μœ„ν•΄ try-catch문을 μ œκ³΅ν•©λ‹ˆλ‹€.

μ˜ˆμ™Έμ²˜λ¦¬λŠ” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œ λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έμ— λŒ€ν•œ 처리 μ½”λ“œλ₯Ό 미리 μž‘μ„±ν•¨μœΌλ‘œμ¨, μ—λŸ¬ λ°œμƒ μ‹œ ν”„λ‘œκ·Έλž¨μ˜ 비정상적인 μ’…λ£Œλ₯Ό μ˜ˆλ°©ν•΄μ£ΌλŠ” 역할을 ν•˜λ©° λ‹€μŒκ³Ό 같이 μž‘μ„±ν•΄ 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

try {
	// μ˜ˆμ™Έκ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” μ½”λ“œ μž‘μ„±
} catch(Exception1 e) {
	// Exception1 μœ ν˜•μ˜ μ˜ˆμ™Έ λ°œμƒμ‹œ μ‹€ν–‰μ½”λ“œ
} catch(Exception2 e) {
	// Exception2 μœ ν˜•μ˜ μ˜ˆμ™Έ λ°œμƒμ‹œ μ‹€ν–‰ μ½”λ“œ
} finally {
	// μ˜ˆμ™Έ λ°œμƒ 여뢀와 상관없이 항상 μ‹€ν–‰
	// ν•„μˆ˜ μ˜΅μ…˜μ€ μ•„λ‹˜
}

try의 λΈ”λŸ­ μ•ˆμ—λŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” μ½”λ“œλ₯Ό μž…λ ₯ν•©λ‹ˆλ‹€. λ§Œμ•½ μ˜ˆμ™Έ 없이 정상적인 싀행이 λœλ‹€λ©΄ catchλΈ”λŸ­μ€ μ‹€ν–‰ν•˜μ§€ μ•Šκ³  λ°”λ‘œ finalλΈ”λŸ­ λ‚΄μ˜ μ½”λ“œκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.

λ§Œμ•½ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ§€λ§Œ catchλΈ”λŸ­μ— μΌμΉ˜ν•˜λŠ” μ˜ˆμ™Ένƒ€μž…μ΄ μ—†λ‹€λ©΄ λ‹Ήμ—°ν•˜κ²Œλ„ μ‹€ν–‰λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

4. μ˜ˆμ™Έ μ „κ°€

μ•žμ„œ μ†Œκ°œν•΄λ“œλ¦° try-catch문을 μ‚¬μš©ν•˜λŠ” 것 외에도 μ˜ˆμ™Έ 처리λ₯Ό ν•  수 μžˆλŠ” 방법이 μžˆμŠ΅λ‹ˆλ‹€. λ°”λ‘œ λ©”μ„œλ“œμ— throws ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ©”μ„œλ“œ λ‚΄μ—μ„œ λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έ 클래슀λ₯Ό μž‘μ„±ν•΄ μ£Όλ©΄ λ©λ‹ˆλ‹€.

public void Example() throws Exception1, Exception2 {}

λ§Œμ•½ throwsν‚€μ›Œλ“œ 뒀에 Exception을 μž‘μ„±ν•˜λ©΄ Exception은 λͺ¨λ“  μ˜ˆμ™Έμ˜ μ΅œμƒμœ„ 클래슀이기 λ•Œλ¬Έμ— λͺ¨λ“  μ’…λ₯˜μ˜ μ˜ˆμ™Έκ°€ λ°œμƒκ°€λŠ₯ν•˜λ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

πŸ“š Reference