λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ“šμ½μ€ μ±… 정리/μ΄νŽ™ν‹°λΈŒμžλ°”

[μ΄νŽ™ν‹°λΈŒ μžλ°”] 10μž₯ : μ˜ˆμ™Έ

μ˜ˆμ™Έλ₯Ό μ œλŒ€λ‘œ ν™œμš©ν•œλ‹€λ©΄ ν”„λ‘œκ·Έλž¨μ˜ 가독성, μ‹ λ’°μ„±, μœ μ§€λ³΄μˆ˜μ„±μ„ λ†’μ•„μ§€κ²Œ ν• μˆ˜ μžˆλ‹€.

μ•„μ΄ν…œ 69 : μ˜ˆμ™ΈλŠ” μ§„μ§œ μ˜ˆμ™Έ μƒν™©μ—μ„œλ§Œ μ‚¬μš©ν•˜λΌ

μ•„λž˜ μ½”λ“œλŠ” μ˜ˆμ™Έλ₯Ό μ™„μ „νžˆ 잘λͺ» μ‚¬μš©ν•œ μ˜ˆμ΄λ‹€.

try {
	int i = 0;
	while(true)
		range[i++].climb();
} catch (ArrayIndexOutOfBoundsException e) {
}

ν•΄λ‹Ή μ½”λ“œλŠ” λ¬΄ν•œλ£¨ν”„λ₯Ό λŒλ‹€κ°€ μ˜ˆμ™Έλ₯Ό 톡해 끝을 λ‚΄κ³  μžˆλ‹€. 이 μ½”λ“œλŠ” μ•„λ§ˆ λ°°μ—΄ 경계검사λ₯Ό ν•˜μ§€ μ•ŠκΈ°μ— μ„±λŠ₯이 더 쒋을 거라 μƒκ°ν•˜κ³  쓴것 κ°™λ‹€.

 

ν•˜μ§€λ§Œ μ΄λŠ” 잘λͺ»λœ 좔둠이닀.

  1. μ˜ˆμ™ΈλŠ” μ˜ˆμ™Έ μƒν™©μ—μ„œ μ“Έ μš©λ„λ‘œ μ„€κ³„λ˜μ—ˆκ³  μ΅œμ ν™”μ— μ•½ν•˜λ‹€.
  2. try-catch λΈ”λ‘μ•ˆμ—μ„œλŠ” JVM이 μ μš©ν•  수 μžˆλŠ” μ΅œμ ν™”κ°€ μ œν•œλœλ‹€.
  3. 배열을 μˆœνšŒν•˜λŠ” ν‘œμ€€κ΄€μš©κ΅¬λŠ” 쀑볡 검사λ₯Ό μˆ˜ν–‰ν•˜μ§€ μ•Šκ³  μ•Œμ•„μ„œ μ΅œμ ν™”ν•œλ‹€.

μ˜ˆμ™Έλ₯Ό 일반적인 μ œμ–΄ νλ¦„μ—μ„œ μ‚¬μš©ν•˜λ©΄ μ ˆλŒ€ μ•ˆλœλ‹€. μ˜ˆμ™ΈλŠ” 였직 μ˜ˆμ™Έ μƒν™©μ—μ„œλ§Œ μ¨μ•Όν•œλ‹€.

→ μ˜ˆμ™Έλ₯Ό 일반적인 μƒν™©μ—μ„œ μ‚¬μš©ν•˜λ©΄ ν˜Όλž€μ„ μ•ΌκΈ°ν•  수 있고 μ˜ˆμ™Έλ₯Ό 일반적인 μƒν™©μœΌλ‘œ κ°„μ£Όν•  수 도 μžˆλ‹€.

 

잘 μ„€κ³„λœ API라면 ν΄λΌμ΄μ–ΈνŠΈκ°€ 정상적인 μ œμ–΄ νλ¦„μ—μ„œ μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•  일이 μ—†κ²Œ ν•΄μ•Όν•œλ‹€.

→ νŠΉμ • μƒνƒœμ—μ„œλ§Œ ν˜ΈμΆœν•  수 μžˆλŠ” ‘μƒνƒœ 의쑴적' λ©”μ„œλ“œλŠ” ‘μƒνƒœ 검사' λ©”μ„œλ“œλ„ ν•¨κ»˜ μ œκ³΅ν•΄μ•Όν•œλ‹€. 예) IteratorμΈν„°νŽ˜μ΄μŠ€μ˜ ‘next’와 ‘hasNext’κ°€ 여기에 ν•΄λ‹Ήλœλ‹€.

 

  • ‘μƒνƒœ 의쑴적 λ©”μ„œλ“œ’λ₯Ό μ œκ³΅ν•˜λŠ” ν΄λž˜μŠ€λŠ” ‘μƒνƒœ 검사 λ©”μ„œλ“œ’도 ν•¨κ»˜ μ œκ³΅ν•΄μ•Ό ν•œλ‹€ (μ„ΈνŠΈ)

hasNext와 같은 ‘μƒνƒœκ²€μ‚¬' λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ ‘μƒνƒœ 의쑴적'인 λ©”μ„œλ“œλŠ” κ²°κ΅­ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¬ 수 밖에 μ—†λ‹€. μ΄λŠ” 정상적인 νλ¦„μ—μ„œλ„ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λ―€λ‘œ μ’‹μ§€μ•Šμ€ 방법이닀.

λ‹€λ₯Έ μ„ νƒμ§€λ‘œλŠ” nullμ΄λ‚˜ 빈 μ˜΅μ…”λ„κ°™μ€ νŠΉμˆ˜ν•œ 값을 λ°˜ν™˜ν•˜λŠ” 방법이 μžˆλ‹€.

 

μƒνƒœ 검사 λ©”μ„œλ“œ, μ˜΅μ…”λ„, νŠΉμ • κ°’ 선택 κ°€μ΄λ“œ

  1. μ™ΈλΆ€ 동기화 없이 μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œ μ ‘κ·Όν•˜κ±°λ‚˜ μ™ΈλΆ€ μš”μΈμœΌλ‘œ μƒνƒœκ°€ λ³€ν•  수 μžˆλ‹€λ©΄
    • μ˜΅μ…”λ„μ΄λ‚˜ νŠΉμ • κ°’
    • μƒνƒœ 검사 λ©”μ„œλ“œ 호좜 λ’€ μƒνƒœ 의쑴 λ©”μ„œλ“œ 호좜 ν•œ 사이 μƒνƒœκ°€ λ³€ν•  수 있기 λ•Œλ¬Έ
  2. μ„±λŠ₯이 μ€‘μš”ν•œ μƒν™©μ—μ„œ μƒνƒœ 검사 λ©”μ„œλ“œκ°€ μƒνƒœ 의쑴적 λ©”μ„œλ“œμ˜ μž‘μ—… 일뢀λ₯Ό 쀑볡 μˆ˜ν–‰ν•œλ‹€λ©΄
    • μ˜΅μ…”λ„μ΄λ‚˜ νŠΉμ • κ°’
  3. λ‹€λ₯Έ λͺ¨λ“  경우
    • μƒνƒœ 검사 λ©”μ„œλ“œ 방식이 λ‚«λ‹€
      • 가독성이 μ’‹κ³ , 잘λͺ» μ‚¬μš©ν–ˆμ„ λ•Œ λ°œκ²¬ν•˜κΈ° 쉽닀.

-핡심정리- : μ˜ˆμ™ΈλŠ” μ •μƒμ œμ–΄νλ¦„μ΄ μ•„λ‹Œ μ˜ˆμ™Έμƒν™©μ—μ„œλ§Œ μ‚¬μš©ν•˜μž.

μ•„μ΄ν…œ 70 : 볡ꡬ할 수 μžˆλŠ” μƒν™©μ—μ„œλŠ” 검사 μ˜ˆμ™Έλ₯Ό ν”„λ‘œκ·Έλž˜λ° 였λ₯˜μ—λŠ” λŸ°νƒ€μž„ μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•˜λΌ

μžλ°”λŠ” λ¬Έμ œμƒν™©μ„ μ•Œλ¦¬λŠ” νƒ€μž…μœΌλ‘œ ‘κ²€μ‚¬μ˜ˆμ™Έ, λŸ°νƒ€μž„μ˜ˆμ™Έ, μ—λŸ¬' 3가지λ₯Ό μ œκ³΅ν•œλ‹€.

이 3가지λ₯Ό μ–Έμ œ 무엇을 μ‚¬μš©ν•΄μ•Όν•˜λŠ”μ§€ 쒋은 지침듀을 μ‚΄νŽ΄λ³΄μž.

ν˜ΈμΆœν•˜λŠ” μͺ½μ—μ„œ λ³΅κ΅¬ν•˜λ¦¬λΌ μ—¬κ²¨μ§€λŠ” 상황이라면 검사 μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•˜λΌ.

  • 검사와 비검사λ₯Ό κ΅¬λΆ„ν•˜λŠ” κΈ°λ³Έ κ·œμΉ™ (볡ꡬ κ°€λŠ₯ μ—¬λΆ€)
  • κ²€μ‚¬μ˜ˆμ™Έλ₯Ό λ˜μ§€λ©΄ κ·Έ ν˜ΈμΆœμžλ‚˜ API μ‚¬μš©μžκ°€ κ·Έ 상황을 νšŒλ³΅ν•΄λ‚΄λΌκ³  μš”κ΅¬ν•œ 것이닀.

비검사 throwable은 크게 ‘λŸ°νƒ€μž„ μ˜ˆμ™Έ'와 ‘μ—λŸ¬'이닀. 이 λ‘˜μ€ ν”„λ‘œκ·Έλž¨μ—μ„œ μž‘μ„ ν•„μš”κ°€ μ—†κ±°λ‚˜ μž‘μ§€ λ§μ•„μ•Όν•œλ‹€. 이 λ‘˜μ€ 더 싀행해봐야 싀이 많기 λ•Œλ¬Έμ— μŠ€λ ˆλ“œλŠ” μ μ ˆν•œ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό λ±‰μœΌλ©° μ€‘λ‹¨λœλ‹€.

ν”„λ‘œκ·Έλž˜λ° 였λ₯˜λ₯Ό λ‚˜νƒˆλ‚Ό λ•ŒλŠ” λŸ°νƒ€μž„ μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•˜μž.

λŸ°νƒ€μž„ μ˜ˆμ™Έμ˜ λŒ€λΆ€λΆ„μ€ μ „μ œμ‘°κ±΄μ„ λ§Œμ‘±ν•˜μ§€ λͺ»ν–ˆμ„ λ•Œ λ°œμƒν•œλ‹€.

  • μ „μ œμ‘°κ±΄ μœ„λ°°λž€ ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•΄λ‹Ή API의 μ œμ•½μ„ 지킀지 λͺ»ν–ˆλ‹€λŠ” λœ»μ΄λ‹€ [예) μΈλ±μŠ€λŠ” μŒμˆ˜κ°€ 될 수 μ—†λ‹€]
  • ν”„λ‘œκ·Έλž˜λ° 였λ₯˜μΈμ§€ μ• λ§€ν•˜λ‹€λ©΄ 볡ꡬ κ°€λŠ₯ μ—¬λΆ€λ‘œ κ²€μ‚¬μ˜ˆμ™ΈμΈμ§€, λŸ°νƒ€μž„ μ˜ˆμ™ΈμΈμ§€λ₯Ό νŒλ‹¨ν•˜μž.

μ—λŸ¬λŠ” 보톡 JVM이 μžμ›λΆ€μ‘±, λΆˆλ³€μ‹ 깨짐 λ“± 더 이상 μˆ˜ν–‰μ„ 계속할 수 μ—†λŠ” 상황을 λ‚˜νƒ€λ‚Ό λ•Œ μ‚¬μš©ν•œλ‹€.

  • μžλ°” μ–Έμ–΄ λͺ…μ„Έκ°€ μš”κ΅¬ν•˜λŠ” 것은 μ•„λ‹ˆμ§€λ§Œ Error클래슀λ₯Ό 상속해 ν•˜μœ„ν΄λž˜μŠ€λ₯Ό λ§Œλ“œλŠ” 일은 μžμ œν•˜μž.

μš°λ¦¬κ°€ κ΅¬ν˜„ν•˜λŠ” 비검사 throwable은 λͺ¨λ‘ RuntimeException의 ν•˜μœ„ ν΄λž˜μŠ€μ—¬μ•Ό ν•œλ‹€.

  • ErrorλŠ” μƒμ†μ΄λ‚˜ throw문으둜 λ˜μ§€λŠ”μΌ 이 μ—†μ–΄μ•Ό ν•œλ‹€.

Exception, RuntimeExcetion, throwable을 μƒμ†ν•˜μ§€ μ•ŠλŠ” throwable을 λ§Œλ“€ 수 μžˆμ§€λ§Œ μ ˆλŒ€ μ‚¬μš©ν•˜μ§€ 말자.

  • μ΄λŠ” 정상적인 검사 μ˜ˆμ™Έλ³΄λ‹€ λ‚˜μ„ 게 μ—†μœΌλ©΄μ„œ APIμ‚¬μš©μžλ₯Ό ν—·κ°ˆλ¦¬κ²Œ λ§Œλ“ λ‹€. (ν‘œμ€€μ΄ μ•„λ‹ˆλ―€λ‘œ)

검사 μ˜ˆμ™ΈλΌλ©΄ 볡ꡬ에 ν•„μš”ν•œ 정보λ₯Ό μ•Œλ €μ£ΌλŠ” λ©”μ„œλ“œλ„ ν•¨κ»˜ μ œκ³΅ν•˜μž.

  • 볡ꡬ κ°€λŠ₯ν•œ μ˜ˆμ™Έμ΄λ―€λ‘œ 볡ꡬ μ‹œ μ‚¬μš©ν•  λ©”μ„œλ“œλ„ ν•¨κ»˜ μ•Œλ €μ£Όμž

 

μ•„μ΄ν…œ 71 : ν•„μš” μ—†λŠ” 검사 μ˜ˆμ™Έ μ‚¬μš©μ€ ν”Όν•˜λΌ

검사 μ˜ˆμ™ΈλŠ” κ³Όν•˜λ©΄ μ“°κΈ° λΆˆνŽΈν•œ APIκ°€ 되고 μ λ‹Ήνžˆ μš”λ¦¬ν•˜λ©΄ API의 μ§ˆμ„ 높일 수 μžˆλ‹€.

  • κ²€μ‚¬μ˜ˆμ™Έκ°€ κ³Όν•˜λ©΄ APIμ‚¬μš©μžμ—κ²Œ 뢀담을 μ£Όκ²Œλœλ‹€.
  • κ²€μ‚¬μ˜ˆμ™Έλ₯Ό λ˜μ§€λŠ” λ©”μ„œλ“œλŠ” μžλ°” 8μ—μ„œ μΆ”κ°€λœ 슀트림 μ•ˆμ—μ„œ μ‚¬μš©ν•  수 μ—†λ‹€.

검사 μ˜ˆμ™Έλ₯Ό νšŒν”Όν•˜λŠ” 방법

  • κ²°κ³Ό νƒ€μž…μ„ 담은 μ˜΅μ…”λ„ λ°˜ν™˜. 검사 μ˜ˆμ™Έ λŒ€μ‹  빈 μ˜΅μ…”λ„ λ°˜ν™˜
  • 검사 μ˜ˆμ™Έλ₯Ό λ˜μ§€λŠ” λ©”μ„œλ“œλ₯Ό 2개둜 μͺΌκ°œ 비검사 μ˜ˆμ™Έλ‘œ λ³€κ²½ (hasNext(), next() 관계)

-핡심정리-

APIν˜ΈμΆœμžκ°€ μ˜ˆμ™Έ μƒν™©μ—μ„œ 볡ꡬ할 방법이 μ—†λ‹€λ©΄ λΉ„κ²€μ‚¬μ˜ˆμ™Έλ₯Ό λ˜μ§€μž.

λ§Œμ•½, 볡ꡬ가 κ°€λŠ₯ν•˜κ³  처리λ₯Ό ν•΄μ£ΌκΈΈ μ›ν•œλ‹€λ©΄ μš°μ„ μ μœΌλ‘œ μ˜΅μ…”λ„μ„ λ°˜ν™˜ν•΄λ„ 될지 κ³ λ―Όν•˜μž. μ˜΅μ…”λ„λ‘œ μΆ©λΆ„ν•œ 정보λ₯Ό μ œκ³΅ν•  수 없을 λ•Œ ‘검사 μ˜ˆμ™Έ'λ₯Ό λ˜μ§€μž.

μ•„μ΄ν…œ 72 : ν‘œμ€€ μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•˜λΌ

μˆ™λ ¨λœ ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” 그렇지 λͺ»ν•œ ν”„λ‘œκ·Έλž˜λ¨Έλ³΄λ‹€ 더 λ§Žμ€ μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•œλ‹€..!

μžλ°” λΌμ΄λΈŒλŸ¬λ¦¬λŠ” λŒ€λΆ€λΆ„ APIμ—μ„œ 쓰기에 μΆ©λΆ„ν•œ 수의 μ˜ˆμ™Έλ₯Ό μ œκ³΅ν•œλ‹€.

 

ν‘œμ€€ μ˜ˆμ™Έλ₯Ό μž¬μ‚¬μš©ν•˜λ©΄

  • APIκ°€ λ‹€λ₯Έ μ‚¬λžŒμ΄ 읡히고 μ‚¬μš©ν•˜κΈ° μ‰¬μ›Œμ§„λ‹€. λ§Žμ€ λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ—κ²Œ μ΅μˆ™ν•΄μ§„ κ·œμ•½μ„ λ”°λ₯΄κΈ° λ•Œλ¬Έμ΄λ‹€.
  • μ˜ˆμ™Έ ν΄λž˜μŠ€κ°€ μ μ„μˆ˜λ‘ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰, 클래슀 적재 μ‹œκ°„μ΄ 쀄어든닀.

---

IlegalArgumentException : 인수둜 λΆ€μ μ ˆν•œ 값을 λ„˜κ²Όμ„ λ•Œ

IllegalStateException : λŒ€μƒ 객체의 μƒνƒœκ°€ λ©”μ„œλ“œ μˆ˜ν–‰ν•  수 없을 λ•Œ (정상 μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ 객체의 μ‚¬μš©)

NullPointerException : null을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” λ©”μ„œλ“œμ— null을 건낼 λ•Œ

IndexOutOfBoundsException : μ‹œν€€μŠ€μ˜ ν—ˆμš©λ²”μœ„λ₯Ό λ„˜λŠ” 값을 건낼 λ•Œ

ConcurrentModificationException : 단일 μŠ€λ ˆλ“œμ—μ„œ μ‚¬μš©ν•˜λ € μ„€κ³„ν•œ 객체λ₯Ό μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œ μˆ˜μ •ν•˜λ € ν•  λ•Œ

상황이 λΆ€ν•©ν•œλ‹€λ©΄ 항상 ν‘œμ€€ μ˜ˆμ™Έλ₯Ό μž¬μ‚¬μš©ν•˜μž. μ΄λ•Œ APIλ¬Έμ„œλ₯Ό μ°Έκ³ ν•΄ κ·Έ μ˜ˆμ™Έκ°€ μ–΄λ–€ μƒν™©μ—μ„œ λ„˜κ²¨μ§€λŠ” 지 ν™•μΈν•΄μ•Όλ§Œ ν•œλ‹€.

λ§Œμ•½, λ”λ§Žμ€ 정보λ₯Ό μ œκ³΅ν•˜κΈΈ μ›ν•œλ‹€λ©΄ ν‘œμ€€μ˜ˆμ™Έλ₯Ό ν™•μž₯ν•˜λŠ” 것도 μ’‹λ‹€.

---

Exception, RuntimeException, Throwable, Error λŠ” 직접 μž¬μ‚¬μš©ν•˜μ§€ 말자

마치 μΆ”μƒν΄λž˜μŠ€λΌκ³  μƒκ°ν•˜κ³  직접 μ‚¬μš©ν•˜μ§€ 말자.

  • μ—¬λŸ¬ μ„±κ²©μ˜ μ˜ˆμ™Έλ₯Ό ν¬κ΄„ν•˜λŠ” ν΄λž˜μŠ€μ΄λ―€λ‘œ μ•ˆμ •μ μœΌλ‘œ ν…ŒμŠ€νŠΈν•  수 μ—†λ‹€.

IllegalStateExceptionκ³Ό IllegalArgumentException의 ꡬ뢄

μΈμˆ˜κ°’μ΄ λ­μ˜€λ“  μ‹€νŒ¨ν–ˆμ„ 상황이라면 μ „μžλ₯Ό 선택, 그렇지 μ•Šλ‹€λ©΄ ν›„μžλ₯Ό μ„ νƒν•œλ‹€.

μ•„μ΄ν…œ 73 : 좔상화 μˆ˜μ€€μ— λ§žλŠ” μ˜ˆμ™Έλ₯Ό λ˜μ§€λΌ

μˆ˜ν–‰ν•˜λ €λŠ” 일과 κ΄€λ ¨ μ—†λŠ” μ˜ˆμ™Έκ°€ λ‚˜μ˜€λ©΄ λ‹Ήν™©μŠ€λŸ½λ‹€. μ΄λŠ” μ €μˆ˜μ€€μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜μ§€ μ•Šκ³  λ°”κΉ₯으둜 μ „νŒŒν•΄λ²„λ¦΄ λ•Œ μ’…μ’… μΌμ–΄λ‚œλ‹€. (μ΄λŠ” λ‚΄λΆ€ κ΅¬ν˜„ 방식을 λ“œλŸ¬λ‚΄μ–΄ μœ— 레벨 APIλ₯Ό μ˜€μ—Όμ‹œν‚¨λ‹€)

λ˜ν•œ, λ‹€μŒ λ¦΄λ¦¬μ¦ˆμ—μ„œ κ΅¬ν˜„ 방식을 λ°”κΎΈλ©΄ λ‹€λ₯Έ μ˜ˆμ™Έκ°€ νŠ€μ–΄λ‚˜μ™€ κΈ°μ‘΄ ν΄λΌμ΄μ–ΈνŠΈ ν”„λ‘œκ·Έλž¨μ„ κΉ¨μ§€κ²Œ ν•  μˆ˜λ„ μžˆλ‹€.

이 문제λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄μ„œλŠ”

μƒμœ„ κ³„μΈ΅μ—μ„œλŠ” μ €μˆ˜μ€€ μ˜ˆμ™Έλ₯Ό μž‘μ•„ μžμ‹ μ˜ 좔상화 μˆ˜μ€€μ— λ§žλŠ” μ˜ˆμ™Έλ‘œ λ°”κΏ” λ˜μ Έμ•Όν•œλ‹€.

  • μ˜ˆμ™Έ λ²ˆμ—­
try {
	... // μ €μˆ˜μ€€ 좔상화 μ‚¬μš©
} catch (LowLevelException e) {
	// 좔상화 μˆ˜μ€€μ— 맞게 λ²ˆμ—­
	throw new HighLevelEception(...);
}

 

  • μ˜ˆμ™Έ 연쇄
    • μ €μˆ˜μ€€ μ˜ˆμ™Έκ°€ 디버깅에 도움이 λœλ‹€λ©΄ κ³ μˆ˜μ€€ μ˜ˆμ™Έμ— 싀어보낸닀.
try {
	... // μ €μˆ˜μ€€ 좔상화 μ‚¬μš©
} catch (LowLevelException cause) {
	// 좔상화 μˆ˜μ€€μ— 맞게 λ²ˆμ—­
	throw new HighLevelEception(cause);
}

 

μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•  λ•Œ ν•„μš”ν•˜λ‹€λ©΄ μ €μˆ˜μ€€μ˜ˆμ™Έλ„ μ°Έκ³ ν•  수 μžˆλ‹€.

λ¬΄ν„±λŒ€κ³  μ €μˆ˜μ€€ μ˜ˆμ™Έλ₯Ό μ „νŒŒν•˜λŠ” κ²ƒλ³΄λ‹€λŠ” μ˜ˆμ™Έ λ²ˆμ—­μ΄ μš°μˆ˜ν•œ λ°©λ²•μ΄μ§€λ§Œ λ‚¨μš©ν•˜μ§„ 말자.

λ¨Όμ € μ €μˆ˜μ€€ μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ λ…Έλ ₯ν•˜μž.

  • μƒμœ„ λ©”μ„œλ“œμ—μ„œ λ§€κ°œλ³€μˆ˜ 값을 κ²€μ‚¬ν•˜μž
  • κ·Έλž˜λ„ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€λ©΄ μƒμœ„ κ³„μΈ΅μ—μ„œ μ˜ˆμ™Έλ₯Ό 쑰용히 μ²˜λ¦¬ν•˜μ—¬ ν˜ΈμΆœμžμ—κ²Œ μ „λ‹¬ν•˜μ§€ μ•ŠλŠ” 방법이 μžˆλ‹€. 그리고 μ˜ˆμ™Έλ₯Ό λ‘œκΉ…ν•΄λ‘μ–΄ λ‚˜μ€‘μ— ν•„μš”ν•œ 쑰치λ₯Ό μ·¨ν•  수 μžˆλ‹€.

μ•„μ΄ν…œ 74 : λ©”μ„œλ“œκ°€ λ˜μ§€λŠ” λͺ¨λ“  μ˜ˆμ™Έλ₯Ό λ¬Έμ„œν™”ν•˜λΌ

검사 μ˜ˆμ™ΈλŠ” 항상 λ”°λ‘œλ”°λ‘œ μ„ μ–Έν•˜κ³ , 각 μ˜ˆμ™Έκ°€ λ°œμƒν•˜λŠ” 상황을 μžλ°”λ…μ˜ ‘@throw’ νƒœκ·Έλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •ν™•νžˆ λ¬Έμ„œν™” ν•˜μž.

λ©”μ„œλ“œκ°€ 던질 수 μžˆλŠ” 에외λ₯Ό 각각 @throws νƒœκ·Έλ‘œ λ¬Έμ„œν™”ν•˜λ˜, 비검사 μ˜ˆμ™ΈλŠ” λ©”μ„œλ“œ μ„ μ–Έμ˜ throws λͺ©λ‘μ— 넣지 말자

  • 검사인지 비검사인지에 따라 ν•΄μ•Όν•  일이 λ‹¬λΌμ§€λ―€λ‘œ λ©”μ„œλ“œ μ‚¬μš©μžκ°€ 비검사 μ˜ˆμ™Έλ₯Ό κ΅¬λΆ„ν•˜κ²Œ ν•˜μž.

ν•œ ν΄λž˜μŠ€μ— μ •μ˜λœ μ—¬λŸ¬ λ©”μ„œλ“œκ°€ 같은 이유둜 같은 μ˜ˆμ™Έλ₯Ό λ˜μ§„λ‹€λ©΄ κ·Έ μ˜ˆμ™Έλ₯Ό (각각의 λ©”μ„œλ“œκ°€ μ•„λ‹Œ) 클래슀 μ„€λͺ…에 μΆ”κ°€ν•˜λŠ” 방법도 μžˆλ‹€.

μ•„μ΄ν…œ 75 : μ˜ˆμ™Έμ˜ 상세 λ©”μ‹œμ§€μ— μ‹€νŒ¨ κ΄€λ ¨ 정보λ₯Ό λ‹΄μœΌλΌ

μ‹€νŒ¨ μˆœκ°„μ„ ν¬μ°©ν•˜λ €λ©΄ λ°œμƒν•œ μ˜ˆμ™Έμ™€ κ΄€μ—¬λœ λͺ¨λ“  λ§€κ°œλ³€μˆ˜μ™€ ν•„λ“œμ˜ 값을 μ‹€νŒ¨ λ©”μ‹œμ§€μ— λ‹΄μ•„μ•Ό ν•œλ‹€.

μ˜ˆμ‹œλ‘œ IndexOutOfBoundException μƒμ„±μžλŠ” String을 λ°›μ§€λ§Œ μ•„λž˜μ™€ 같이 μ‹€νŒ¨ 상황을 μ˜¨μ „νžˆ 포착해도 μ’‹μ•˜μ„ 것이닀.

public class IndexOutOfBoundsException extends RuntimeException {
    private final int lowerBound;
    private final int upperBound;
    private final int index;

    /**
     * IndexOutOfBoundsException을 μƒμ„±ν•œλ‹€.
     *
     * @param lowerBound 인덱슀의 μ΅œμ†Ÿκ°’
     * @param upperBound 인덱슀의 μ΅œλŒ“κ°’ + 1
     * @param index      인덱슀의 μ‹€μ ―κ°’
     */
    public IndexOutOfBoundsException(int lowerBound, int upperBound,
                                     int index) {
        // μ‹€νŒ¨λ₯Ό ν¬μ°©ν•˜λŠ” 상세 λ©”μ‹œμ§€λ₯Ό μƒμ„±ν•œλ‹€.
        super(String.format(
                "μ΅œμ†Ÿκ°’: %d, μ΅œλŒ“κ°’: %d, 인덱슀: %d",
                lowerBound, upperBound, index));

        // ν”„λ‘œκ·Έλž¨μ—μ„œ μ΄μš©ν•  수 μžˆλ„λ‘ μ‹€νŒ¨ 정보λ₯Ό μ €μž₯ν•΄λ‘”λ‹€.
        this.lowerBound = lowerBound;
        this.upperBound = upperBound;
        this.index = index;
    }
}

μ΄λ ‡κ²Œ 해두면 ν”„λ‘œκ·Έλž˜λ¨Έκ°€ λ˜μ§€λŠ” μ˜ˆμ™ΈλŠ” μžμ—°μŠ€λŸ½κ²Œ μ‹€νŒ¨λ₯Ό 더 잘 ν¬μ°©ν•œλ‹€. κ³ ν’ˆμ§ˆμ˜ 상세 λ©”μ‹œμ§€λ₯Ό μ˜ˆμ™Έ 클래슀 μ•ˆμœΌλ‘œ λͺ¨μ•„μ£Όλ―€λ‘œ 클래슀 μ‚¬μš©μžκ°€ λ©”μ‹œμ§€λ₯Ό λ§Œλ“œλŠ” μž‘μ—…μ„ λ°˜λ³΅ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

λ˜ν•œ, μ˜ˆμ™ΈλŠ” μ‹€νŒ¨μ™€ κ΄€λ ¨λœ 정보λ₯Ό 얻을 수 μžˆλŠ” μ ‘κ·Όμž λ©”μ„œλ“œλ₯Ό 적절히 μ œκ³΅ν•˜λŠ” 것이 μ’‹λ‹€.

μ•„μ΄ν…œ 76 : κ°€λŠ₯ν•œ ν•œ μ‹€νŒ¨ μ›μžμ μœΌλ‘œ λ§Œλ“€λΌ

호좜된 λ©”μ„œλ“œκ°€ μ‹€νŒ¨ν•˜λ”λΌλ„ ν•΄λ‹Ή κ°μ²΄λŠ” λ©”μ„œλ“œ 호좜 μ „ μƒνƒœλ₯Ό μœ μ§€ν•΄μ•Όν•œλ‹€.

→ μ΄λŸ¬ν•œ νŠΉμ„±μ„ ‘μ‹€νŒ¨ μ›μžμ '이라고 ν•œλ‹€.

  • λ©”μ„œλ“œλ₯Ό μ‹€νŒ¨ μ›μžμ μœΌλ‘œ λ§Œλ“œλŠ” 방법
    • λΆˆλ³€ 객체둜 섀계 (생성 μ‹œμ μ— κ³ μ •λ˜μ–΄ μƒνƒœκ°€ λ³€ν•˜μ§€ μ•ŠμŒ)
    • κ°€λ³€ κ°μ²΄λŠ” μž‘μ—… μˆ˜ν–‰ μ „ λ§€κ°œλ³€μˆ˜μ˜ μœ νš¨μ„± 검사λ₯Ό ν•˜λŠ” 것 (객체 λ‚΄λΆ€ μƒνƒœ λ³€κ²½ μ „ 잠재적 μ˜ˆμ™Έλ₯Ό κ±ΈλŸ¬λƒ„)
    • μ‹€νŒ¨ν•  κ°€λŠ₯성이 μžˆλŠ” λͺ¨λ“  μ½”λ“œλ₯Ό 객체의 μƒνƒœλ₯Ό λ°”κΎΈλŠ” μ½”λ“œλ³΄λ‹€ μ•žμ— λ°°μΉ˜ν•œλ‹€
    • 객체의 μž„μ‹œ λ³΅μ‚¬λ³Έμ—μ„œ μž‘μ—…μ„ μˆ˜ν–‰ν•œ λ‹€μŒ, μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜λ©΄ μ›λž˜ 객체와 κ΅μ²΄ν•œλ‹€.
    • μž‘μ—… 도쀑 λ°œμƒν•˜λŠ” μ‹€νŒ¨λ₯Ό κ°€λ‘œμ±„λŠ” 볡ꡬ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ—¬ μž‘μ—… μ „ μƒνƒœλ‘œ λ˜λŒλ¦°λ‹€

λ©”μ„œλ“œ λͺ…세에 κΈ°μˆ ν•œ μ˜ˆμ™ΈλΌλ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ”λΌλ„ 객체의 μƒνƒœλŠ” λ©”μ„œλ“œ 호좜 μ „κ³Ό λ˜‘κ°™μ΄ μœ μ§€λΌμ•Ό ν•œλ‹€. 이 κ·œμΉ™μ„ 지킀지 λͺ»ν•˜λ©΄ μ‹€νŒ¨ μ‹œμ˜ 객체 μƒνƒœλ₯Ό API μ„€λͺ…에 λͺ…μ‹œν•΄μ•Όλ§Œ ν•œλ‹€. 이것은 λ§Žμ€ APIλ¬Έμ„œμ—μ„œ μ§€μΌœμ§€μ§€ μ•Šκ³  μžˆλ‹€.

μ•„μ΄ν…œ 77 : μ˜ˆμ™Έλ₯Ό λ¬΄μ‹œν•˜μ§€ 말라

API μ„€κ³„μžκ°€ λ©”μ„œλ“œ 선언에 μ˜ˆμ™Έλ₯Ό λͺ…μ‹œν•˜λŠ” κΉŒλ‹­μ€ κ·Έ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  λ•Œ μ μ ˆν•œ 쑰치λ₯Ό 취해달라고 μš”μ²­ν•˜λŠ” 것이닀...!

  • μ˜ˆμ™Έμ²˜λ¦¬μ—μ„œ 아무것도 ν•˜μ§€ μ•ŠλŠ” μ½”λ“œ
try {
} catch (SomeException) {
}

catch λΈ”둝을 λΉ„μ›Œλ‘λ©΄ μ˜ˆμ™Έκ°€ μ‘΄μž¬ν•  μ΄μœ κ°€ 없어진닀

μ˜ˆμ™Έλ₯Ό λ¬΄μ‹œν•˜κΈ°λ‘œ ν–ˆλ‹€λ©΄ catch λΈ”둝 μ•ˆμ— κ·Έλ ‡κ²Œ κ²°μ •ν•œ 이유λ₯Ό μ£Όμ„μœΌλ‘œ 남기고, μ˜ˆμ™Έ λ³€μˆ˜μ˜ 이름도 ignored둜 λ°”κΎΈμž

int numColors = 4;
try {
	numColors = f.get(1L, TimeUnit.SECONDS);
} catch (TimeOutException | ExecutionException ignored) {
  	// 기본값을 μ‚¬μš©ν•œλ‹€ (색상 수λ₯Ό μ΅œμ†Œν™”ν•˜λ©΄ μ’‹μ§€λ§Œ, ν•„μˆ˜λŠ” μ•„λ‹ˆλ‹€).
}

μ˜ˆμ™Έλ₯Ό λͺ» λ³Έμ²™ν•˜κ³  μ§€λ‚˜μΉ˜λ©΄ ν”„λ‘œκ·Έλž¨μ€ 였λ₯˜λ₯Ό λ‚΄μž¬ν•œ 채 λ™μž‘ν•˜κ²Œ λœλ‹€.

μ΄λŠ” μ–΄λŠ μˆœκ°„ 문제의 원인과 아무 μƒκ΄€μ—†λŠ” κ³³μ—μ„œ κ°‘μžκΈ° 죽어버릴 수 μžˆλ‹€.

였λ₯˜λ₯Ό 적절히 μ²˜λ¦¬ν•˜κ±°λ‚˜ λ¬΄μ‹œν•˜μ§€ μ•Šκ³  λ°”κΉ₯으둜 μ „νŒŒλΌλ„ ν•˜μž. μ΄λ ‡κ²ŒλΌλ„ ν•΄μ•Ό λ””λ²„κΉ…μ •λ³΄λŠ” 남겨두고 ν”„λ‘œκ·Έλž¨μ΄ μ£½κ²Œν•  수 μžˆλ‹€.