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

[Java] - μ˜ˆμ™Έ(Exception), μ˜ˆμ™Έ 처리(Exception Handling)

by 주발2 2021. 5. 8.
λ°˜μ‘ν˜•

 μ•ˆλ…•ν•˜μ„Έμš”~ 이전에 μš΄μ˜ν•˜λ˜ λΈ”λ‘œκ·Έ 및 GitHub, 곡뢀 λ‚΄μš©μ„ μ •λ¦¬ν•˜λŠ” Study-GitHub κ°€ μžˆμŠ΅λ‹ˆλ‹€!

 λ„€μ΄λ²„ λΈ”λ‘œκ·Έ

 GitHub

Study-GitHub

 πŸ”


 

πŸ“Ž μžλ°”μ—μ„œμ˜ μ˜ˆμ™Έ 처리(Exception Handling)

μ•ˆλ…•ν•˜μ„Έμš”~ μ΄λ²ˆμ— 정리할 λ‚΄μš©μ€ μ˜ˆμ™Έ 및 μ˜ˆμ™Έμ²˜λ¦¬μ— λŒ€ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.

μ˜ˆμ™Έ μ²˜λ¦¬μ— λŒ€ν•œ 뢀뢄은 정말 μ€‘μš”ν•˜λ‹€κ³  μƒκ°ν•˜λŠ”λ°μš”, μ΄λ²ˆμ— 개인적으둜 κ°œλ°œμ„ μ§„ν–‰ν•˜λ©΄μ„œ μ˜ˆμ™Έ κ΄€λ ¨λ˜μ–΄μ„œ ν—·κ°ˆλ¦¬λŠ” 뢀뢄이 λͺ‡λͺ‡ μžˆμ—ˆκΈ°μ— κ°„λž΅ν•˜κ²Œ μ •λ¦¬ν•˜κ³ μž ν•©λ‹ˆλ‹€! πŸ˜ƒ


 

 

μ˜ˆμ™Έ(Exception)λž€ ?

  • ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑에 λ°œμƒν•˜λŠ” 'μ˜ˆμ™Έμ μΈ 상황
  • 정상적인 λͺ…λ Ή 흐름을 λ°©ν•΄ν•˜λŠ” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑에 λ°œμƒν•˜λŠ” 이벀트
  • λ‹¨μˆœν•œ 문법적 였λ₯˜κ°€ μ•„λ‹Œ μ‹€ν–‰ 쀑간에 λ°œμƒν•˜λŠ” '정상적이지 μ•Šμ€ 상황'
  • e.g) 0으둜 λ‚˜λˆ„λŠ” κ²½μš°λ‚˜ λ°°μ—΄μ—μ„œ 인덱슀λ₯Ό λ²—μ–΄λ‚œ 경우 λ“±λ“±

μ΄νŽ™ν‹°λΈŒ μžλ°” 3/E μ—μ„œλŠ” λ‹€μŒκ³Ό 같이 λ§ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

"μ˜ˆμ™Έλ₯Ό μ œλŒ€λ‘œ ν™œμš©ν•œλ‹€λ©΄ ν”„λ‘œκ·Έλž¨μ˜ 가독성, μ‹ λ’°μ„±, μœ μ§€λ³΄μˆ˜μ„±μ΄ λ†’μ•„μ§€μ§€λ§Œ, 잘λͺ» μ‚¬μš©ν•˜λ©΄ λ°˜λŒ€μ˜ 효과만 λ‚˜νƒ€λ‚œλ‹€."

 

 

 

μ˜ˆμ™Έ 처리(Exception Handling) λž€?

  • μ˜ˆμ™Έ μ²˜λ¦¬λž€ ClassNotFound, IO, SQL λ“±κ³Ό 같은 λŸ°νƒ€μž„ 였λ₯˜λ₯Ό μ²˜λ¦¬ν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜
  • ν”„λ‘œκ·Έλž¨ 싀행에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šλ„λ‘ μ˜ˆμ™Έκ°€ λ°œμƒν•  λ•Œ μ μ ˆν•œ 방법을 제곡
  • μ˜ˆμ™Έ 처리λ₯Ό 톡해 ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•˜μ§€ μ•Šκ³  정상적인 μ‹€ν–‰μƒνƒœ μœ μ§€

 

 

μžλ°”μ—μ„œμ˜ Exception classes 계측 ꡬ쑰

좜처: https://simplesnippets.tech/exception-handling-in-java-part-1/

λͺ¨λ“  μ˜ˆμ™Έ 및 였λ₯˜ μœ ν˜•μ€ Throwable 클래슀의 ν•˜μœ„ 클래슀 μž…λ‹ˆλ‹€.

 

 

μ΄νŽ™ν‹°λΈŒ μžλ°” 3/E μ—μ„œλŠ” λ‹€μŒκ³Ό 같이 λ§ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μžλ°” μ–Έμ–΄ λͺ…μ„Έκ°€ μš”κ΅¬ν•˜λŠ” 것은 μ•„λ‹ˆμ§€λ§Œ, 업계에 널리 νŽ΄μ§„ κ·œμ•½μœΌλ‘œ Error 클래슀λ₯Ό 상속해 ν•˜μœ„ 클래슀λ₯Ό λ§Œλ“œλŠ” 일은 μžμ œν•˜μž.

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

Exception, RuntimeException, Errorλ₯Ό μƒμ†ν•˜μ§€ μ•ŠλŠ” throwable을 λ§Œλ“€ μˆ˜λ„ μžˆμ§€λ§Œ, μ΄λŸ¬ν•œ throwable은 정상적인 사항보닀 λ‚˜μ„ 게 ν•˜λ‚˜λ„ μ—†μœΌλ©΄μ„œ API μ‚¬μš©μžλ₯Ό ν—·κ°ˆλ¦¬κ²Œ ν•  λΏμ΄λ―€λ‘œ μ ˆλŒ€λ‘œ μ‚¬μš©ν•˜μ§€ 말자.

 

 

μœ„ 그림을 톡해 μžλ°”μ—μ„œμ˜ 문제 상황은 였λ₯˜, 검사 μ˜ˆμ™Έ, λŸ°νƒ€μž„ μ˜ˆμ™Έμ˜ μ„Έ κ°€μ§€λ‘œ μœ ν˜•μ„ λ‚˜λˆŒ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

였λ₯˜(Error)

  • μ‹œμŠ€ν…œμ— 비정상적인 상황이 생겼을 λ•Œ λ°œμƒ
  • μ‹œμŠ€ν…œ λ ˆλ²¨μ—μ„œ λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— μ‹¬κ°ν•œ μˆ˜μ€€μ˜ 문제 상황

 

검사 μ˜ˆμ™Έ(Check Exception)

  • 컴파일 λ‹¨κ³„μ—μ„œ λͺ…ν™•ν•˜κ²Œ Exception 체크(검사)κ°€ κ°€λŠ₯ν•œ 것
  • λ°˜λ“œμ‹œ μ˜ˆμ™Έ 처리λ₯Ό ν•΄μ£Όμ–΄μ•Ό 함
  • 컴파일 λ‹¨κ³„μ—μ„œ 확인이 κ°€λŠ₯
  • ex) ClassNotFoundException, IOException

 

λŸ°νƒ€μž„ μ˜ˆμ™Έ(Runtime Exception)

  • 컴파일 단계가 μ•„λ‹Œ μ‹€ν–‰κ³Όμ • 쀑 발견됨
  • λͺ…μ‹œμ μΈ 처리λ₯Ό κ°•μ œν•˜μ§€ μ•ŠμŒ
  • ex) NullPointerException, IndexOutOfBoundException

 

μžλ°” κ°œλ°œμžκ°€ κ°€μž₯ 많이 μ ‘ν•˜λŠ” μ˜ˆμ™Έ 쀑 ν•˜λ‚˜κ°€ NullPointerException μΈλ°μš”, κ°„λ‹¨ν•œ μ½”λ“œλ₯Ό 톡해 μ–Έμ œ λ°œμƒν•˜λŠ”μ§€ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

public class NPEException {

    public static void main(String[] args) {
        final String data = null;

        System.out.println(data.toString());
    }
}

 

ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄ κ°„λ‹¨ν•˜κ²Œ μž‘μ„±ν•œ μ½”λ“œμ΄κΈ° λ•Œλ¬Έμ—, μ‹€λ¬΄μ—μ„œλŠ” μœ„μ™€ 같이 μ—λŸ¬λ₯Ό λ°”λ‘œ 확인할 수 μžˆλŠ” 상황은 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€.

 

 

μœ„ μ½”λ“œλ₯Ό 싀행해보면 μœ„μ™€ 같이 NUllPointerException μ˜ˆμ™Έκ°€ λ°œμƒν•˜λŠ”λ°μš”, null 값을 μ ‘κ·Όν•˜λ € ν–ˆκΈ° λ•Œλ¬Έμ— λ°œμƒν•œ 였λ₯˜μž…λ‹ˆλ‹€.

 

 

μžλ°”μ—μ„œλŠ” μ˜ˆμ™Έ 처리 μ½”λ“œλ₯Ό try-catch-finally 블둝을 톡해 μž‘μ„±μ„ ν•˜λŠ”λ°μš”, 예제 μ½”λ“œλŠ” μ•„λž˜ λΈ”λ‘œκ·Έλ₯Ό μ°Έκ³ ν•΄μ£Όμ„Έμš”!

Java μ˜ˆμ™Έ 처리

 

 

 

 

μžλ°”μ—μ„œ μ˜ˆμ™Έ μ²˜λ¦¬μ— λŒ€ν•œ 9가지 Best Practices

1. finally λΈ”λ½μ—μ„œ μžμ›μ„ ν•΄μ œν•˜κ±°λ‚˜, try-with-resource ꡬ문 μ‚¬μš©

 

2. νŠΉμ • μ˜ˆμ™Έλ₯Ό μ„ ν˜Έ

 

3. μ§€μ •ν•œ μ˜ˆμ™Έλ₯Ό λ¬Έμ„œν™”

 

4. μ˜ˆμ™Έ λ°œμƒμ— μ„€λͺ… λ©”μ‹œμ§€λ₯Ό μΆ”κ°€

 

5. κ°€μž₯ ꡬ체적인 μ˜ˆμ™Έλ₯Ό λ¨Όμ € μž‘μ•„λΌ

 

6. Throwable 은 μž‘μ§€ μ•ŠλŠ”λ‹€.

 

7. μ˜ˆμ™Έλ₯Ό λ¬΄μ‹œν•˜μ§€ μ•ŠλŠ”λ‹€.

 

8. Logλ₯Ό 남기고 μ˜ˆμ™Έλ₯Ό λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

 

9. μ†ŒλΉ„ν•˜μ§€ μ•Šκ³  μ˜ˆμ™Έλ₯Ό 감싸라

 

 

 

 

β€» Java의 μ˜ˆμ™Έ λ¦¬μŠ€νŠΈλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

더보기

java.io

  • IOException
  • CharConversionException
  • EOFException
  • FileNotFoundException
  • InterruptedIOException
  • ObjectStreamException
  • InvalidClassException
  • InvalidObjectException
  • NotActiveException
  • NotSerializableException
  • OptionalDataException
  • StreamCorruptedException
  • WriteAbortedException
  • SyncFailedException
  • UnsupportedEncodingException
  • UTFDataFormatException
  • UncheckedIOException

java.lang

  • ReflectiveOperationException
  • ClassNotFoundException
  • InstantiationException
  • IllegalAccessException
  • InvocationTargetException
  • NoSuchFieldException
  • NoSuchMethodException
  • CloneNotSupportedException
  • InterruptedException

μ‚°μˆ  μ˜ˆμ™Έ

  • IndexOutOfBoundsException
  • ArrayIndexOutOfBoundsException
  • StringIndexOutOfBoundsException
  • ArrayStoreException
  • ClassCastException
  • EnumConstantNotPresentException
  • IllegalArgumentException
  • IllegalThreadStateException
  • NumberFormatException
  • IllegalMonitorStateException
  • IllegalStateException
  • NegativeArraySizeException
  • NullPointerException
  • SecurityException
  • TypeNotPresentException
  • UnsupportedOperationException

java.net

  • HttpRetryException
  • SocketTimeoutException
  • MalformedURLException
  • ProtocolException
  • SocketException
  • BindException
  • ConnectException
  • NoRouteToHostException
  • PortUnreachableException
  • UnknownHostException
  • UnknownServiceException
  • URISyntaxException

java.text

  • ParseException

java.time

  • DateTimeException

 

 

 

 

πŸ“Ž References

github.com/Meet-Coder-Study/book-effective-java

 

https://simplesnippets.tech/exception-handling-in-java-part-1/

 

stackify.com/best-practices-exceptions-java/

 

 

 

 

λ°˜μ‘ν˜•

λŒ“κΈ€