๐Ÿ’ป
ComputerScience
  • ๋ชฉ์ฐจ
  • Operating System
    • ์šด์˜์ฒด์ œ๋ž€
    • ํ”„๋กœ์„ธ์Šค vs ์Šค๋ ˆ๋“œ
    • ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„
    • ์ธํ„ฐ๋ŸฝํŠธ(Interrupt)
    • ์‹œ์Šคํ…œ ์ฝœ(System Call)
    • PCB์™€ Context Switching
    • IPC(Inter Process Communication)
    • CPU ์Šค์ผ€์ค„๋ง
    • ๋ฐ๋“œ๋ฝ(DeadLock)
    • Race Condition
    • ์„ธ๋งˆํฌ์–ด(Semaphore) & ๋ฎคํ…์Šค(Mutex)
    • ํŽ˜์ด์ง• & ์„ธ๊ทธ๋จผํ…Œ์ด์…˜
    • ํŽ˜์ด์ง€ ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ๋ฉ”๋ชจ๋ฆฌ(Memory)
    • ํŒŒ์ผ ์‹œ์Šคํ…œ
  • Network
    • OSI 7 ๊ณ„์ธต
    • TCP 3 way handshake & 4 way handshake
    • TCP/IP ํ๋ฆ„์ œ์–ด & ํ˜ผ์žก์ œ์–ด
    • UDP
    • ๋Œ€์นญํ‚ค & ๊ณต๊ฐœํ‚ค
    • HTTP & HTTPS
    • TLS/SSL handshake
    • ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ(Load Balancing)
    • Blocking,Non-blocking & Synchronous,Asynchronous @LifesLike
    • Blocking & Non-Blocking I/O
  • Algorithm
    • ๊ฑฐํ’ˆ ์ •๋ ฌ(Bubble Sort)
    • ์„ ํƒ ์ •๋ ฌ(Selection Sort)
    • ์‚ฝ์ž… ์ •๋ ฌ(Insertion Sort)
    • ํ€ต ์ •๋ ฌ(Quick Sort) @mimwin
    • ๋ณ‘ํ•ฉ ์ •๋ ฌ(Merge Sort)
    • ํž™ ์ •๋ ฌ(Heap Sort)
    • ๊ธฐ์ˆ˜ ์ •๋ ฌ(Radix Sort)
    • ๊ณ„์ˆ˜ ์ •๋ ฌ(Count Sort)
    • ์ด๋ถ„ ํƒ์ƒ‰(Binary Search)
    • ํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ตฌํ˜„
    • DFS & BFS @sujin-kk
    • ์ตœ์žฅ ์ฆ๊ฐ€ ์ˆ˜์—ด(LIS)
    • ์ตœ์†Œ ๊ณตํ†ต ์กฐ์ƒ(LCA)
    • ๋™์  ๊ณ„ํš๋ฒ•(Dynamic Programming)
    • ๋‹ค์ต์ŠคํŠธ๋ผ(Dijkstra) ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ๋น„ํŠธ๋งˆ์Šคํฌ(BitMask)
  • Database
    • ํ‚ค(Key) ์ •๋ฆฌ
    • SQL - JOIN
    • SQL Injection
    • SQL vs NoSQL
    • ์ •๊ทœํ™”(Nomalization)
    • ์ด์ƒ(Anomaly)
    • ์ธ๋ฑ์Šค(INDEX)
    • ํŠธ๋žœ์žญ์…˜(Transaction)
    • ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Transaction Isolation Level)
    • ์ €์žฅ ํ”„๋กœ์‹œ์ €(Stored PROCEDURE)
    • ๋ ˆ๋””์Šค(Redis) @sujin-kk
  • Java
    • Java ์ปดํŒŒ์ผ ๊ณผ์ •
    • Call by Value vs Call by Reference
    • String & StringBuffer & StringBuilder
    • ์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹ (Java Virtual Machine)
    • Casting(์—…์บ์ŠคํŒ… & ๋‹ค์šด์บ์ŠคํŒ…)
    • ์˜คํ†  ๋ฐ•์‹ฑ & ์˜คํ† ์–ธ๋ฐ•์‹ฑ
    • Thread ํ™œ์šฉ
    • ๊ณ ์œ  ๋ฝ(Intrinsic Lock)
    • ๋ฌธ์ž์—ด ํด๋ž˜์Šค
    • Garbage Collection
    • Promotion & Casting
    • Primitive type & Reference type
    • ์ง๋ ฌํ™”(Serialization)
    • Error & Exception
    • Stream API
    • Record
    • Composition
Powered by GitBook
On this page
  • Error & Exception
  • ๐Ÿ“Œ ๊ธฐ๋ณธ ๊ฐœ๋…
  • ํ”„๋กœ๊ทธ๋žจ ์—๋Ÿฌ
  • Exception๊ณผ Error ํด๋ž˜์Šค์˜ ์ƒ์† ๊ตฌ์กฐ
  • Exception Handling
  • ๐Ÿ“Œ ์˜ˆ์™ธ ์ž˜ ์“ฐ๊ธฐ
  • try-with-resources๋ฅผ ์ด์šฉํ•˜์ž
  • Checked Exception?
  • ์˜ˆ์™ธ ํ™œ์šฉ๋ฒ• - ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”
  1. Java

Error & Exception

Previous์ง๋ ฌํ™”(Serialization)NextStream API

Last updated 2 years ago

Error & Exception

๐Ÿ“Œ ๊ธฐ๋ณธ ๊ฐœ๋…

ํ”„๋กœ๊ทธ๋žจ ์—๋Ÿฌ

  • ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰ ์ค‘ ์–ด๋–ค ์›์ธ์— ์˜ํ•ด์„œ ์˜ค์ž‘๋™์„ ํ•˜๊ฑฐ๋‚˜ ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ, ๊ทธ ๋•Œ ์›์ธ์„ ํ”„๋กœ๊ทธ๋žจ ์—๋Ÿฌ ๋˜๋Š” ์˜ค๋ฅ˜๋ผ๊ณ  ํ•œ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ ์—๋Ÿฌ์˜ ์ข…๋ฅ˜

  1. ์ปดํŒŒ์ผ ์—๋Ÿฌ(compile-time error)

  2. ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ(runtime error)

  3. ๋…ผ๋ฆฌ์  ์—๋Ÿฌ(logical error)

    ์ปดํŒŒ์ผ๋„ ์ž˜๋˜๊ณ  ์‹คํ–‰๋„ ์ž˜๋˜์ง€๋งŒ ์˜๋„์™€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘

    • ์˜ˆ: ์ƒํ’ˆ ์žฌ๊ณ ๊ฐ€ ์Œ์ˆ˜๊ฐ€ ๋จ

์‹คํ–‰ ๋„์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ

์ปดํŒŒ์ผ์„ ์ •์ƒ์ ์œผ๋กœ ๋งˆ์ณ๋„ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰๋„์ค‘ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ด์— ๋Œ€ํ•œ ๋Œ€๋น„๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค.

์ž๋ฐ”์—์„  ๋Ÿฐํƒ€์ž„์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ Error์™€ Exception ๋‘ ๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„ํ–ˆ๋‹ค.

  1. Error - ์—๋Ÿฌ

    ์ผ๋‹จ ๋ฐœ์ƒํ•˜๋ฉด ๋ณต๊ตฌํ•  ์ˆ˜ ์—†๋Š” ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜

    ์˜ˆ) OutOfMemoryError, StackOverflowError

  2. Exception - ์˜ˆ์™ธ

    ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์ˆ˜์Šตํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋„. ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ฏธ๋ฆฌ ์ ์ ˆํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋†“์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ๋น„์ •์ƒ์ ์ธ ์ข…๋ฃŒ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์Œ

Exception๊ณผ Error ํด๋ž˜์Šค์˜ ์ƒ์† ๊ตฌ์กฐ

  • ์ž๋ฐ”์—์„  ์‹คํ–‰ ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜(Exception๊ณผ Error)๋„ ๊ฐ์ฒด์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์กฐ์ƒ์€ Object์ด๋ฏ€๋กœ, Exception๊ณผ Errorํด๋ž˜์Šค๋„ Obejct์˜ ์ž์†์ด๋‹ค.

  • Throwable ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ์—๋Ÿฌ์™€ ์˜ˆ์™ธ์˜ superํด๋ž˜์Šค๋‹ค. Throwable์„ ์ƒ์†ํ•œ ํƒ€์ž…์ด์—ฌ์•ผ ์ž๋ฐ”์˜ throw๋ฌธ์—์„œ ๋˜์ ธ์งˆ ์ˆ˜ ์žˆ๊ณ , catch์ ˆ์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋‹ค. Throwable์€ ๋งŒ๋“ค์–ด์กŒ์„ ๋•Œ ์“ฐ๋ ˆ๋“œ์˜ execution stack์˜ ์Šค๋ƒ…์ƒท์„ ๊ฐ–๊ณ  ์žˆ์–ด StackTrace ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

    • throwable์„ ์ƒ์†ํ•ด์„œ ์“ธ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž.

Error

์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์—์„œ ๋ฐœ์ƒํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ

  • ์˜ˆ

    OutOfMemoryError: JVM์— ์„ค์ •๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ ํ•œ๊ณ„ ๋ฒ—์–ด๋‚จ

    • ํž™ ์‚ฌ์ด์ฆˆ ๋ถ€์กฑ, ๋„ˆ๋ฌด ๋งŽ์€ class ๋กœ๋“œ, ๊ฐ€์šฉ๊ฐ€๋Šฅํ•œ swap์ด ์—†์„ ๋•Œ

    ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด dump ํŒŒ์ผ ๋ถ„์„, jvm ์˜ต์…˜ ์ˆ˜์ •๋“ฑ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Exception

  • ๋ชจ๋“  Exception์˜ ์ตœ๊ณ  ์กฐ์ƒ์€ Exception ํด๋ž˜์Šค์ด๋‹ค.

  • ์˜ˆ์™ธ ํด๋ž˜์Šค๋Š” ๋˜ ๋‘ ๊ฐœ์˜ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ ์งˆ ์ˆ˜ ์žˆ๋‹ค.

    1. RuntimeException ํด๋ž˜์Šค์™€ ์ž์†๋“ค

    2. RuntimeException ํด๋ž˜์Šค์™€ ์ž์†๋“ค์ด ์•„๋‹Œ, Exception ํด๋ž˜์Šค์™€ ์ž์†๋“ค

RuntimeException ํด๋ž˜์Šค๋“ค: Unchecked Excpetion

  • ์ฃผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์‹ค์ˆ˜์— ์˜ํ•ด์„œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

  • ์˜ˆ

    • IndexOutOfBoundsException: ์ž๋ฐ”์˜ ๋ฐฐ์—ด ๋ฒ”์œ„ ๋ฒ—์–ด๋‚จ

    • NullPointerException: null ์ฐธ์กฐ

    • ClassCastException: ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜

    • ArithmeticException: ์ •์ˆ˜๋ฅผ 0์œผ๋กœ ๋‚˜๋ˆ”

    • IllegalArgumentException: ์ž˜๋ชป๋œ ์ธ์ž ์ „๋‹ฌ ์‹œ ๋ฐœ์ƒ

    • IllegalStateException: ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์—๋Š” ๋ถ€์ ์ ˆ

    • UnsupportedOperationException: ๊ฐ์ฒด๊ฐ€ ์š”์ฒญ๋œ operation์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

  • Unchecked: ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ํ•˜์ง€ ์•Š์•„๋„ ์ปดํŒŒ์ผ ๋œ๋‹ค

  • Error์™€ ๊ทธ ์ž์†๋“ค๋„ Unchecked ์—๋Ÿฌ์ด๋‹ค. try-catch ๋ธ”๋Ÿญ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    • ์—๋Ÿฌ๋Š” ๋ณดํ†ต JVM์ด ์ž์› ๋ถ€์กฑ ๋“ฑ ๋” ์ด์ƒ ์ˆ˜ํ–‰์„ ๊ณ„์†ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์„ ๋‚˜ํƒ€๋‚ผ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ๋”ฐ๋ผ์„œ Error ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•ด ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์ผ์€ ์ž์ œํ•˜์ž.

Exception ํด๋ž˜์Šค๋“ค: Checked Exception

  • ์ฃผ๋กœ ์™ธ๋ถ€์˜ ์˜ํ–ฅ, ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์šฉ์ž์˜ ๋™์ž‘์— ์˜ํ•ด ๋ฐœ์ƒ

  • ์˜ˆ

    • IOException

    • FileNotFoundException

    • ClassNotFoundException

    • DataFormatException

  • Checked: ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ ๋˜์ง€ ์•Š๋Š”๋‹ค.

Exception Handling

  • ์ •์˜: ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ์˜ ๋ฐœ์ƒ์— ๋Œ€๋น„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ

  • ๋ชฉ์ : ์˜ˆ์™ธ์˜ ๋ฐœ์ƒ์œผ๋กœ ์ธํ•œ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ‘์ž‘์Šค๋Ÿฐ ์ข…๋ฃŒ๋ฅผ ๋ง‰๊ณ , ์ •์ƒ์ ์ธ ์‹คํ–‰์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ

๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋ฉฐ, ์ฒ˜๋ฆฌ๋˜์ง€ ๋ชปํ•œ ์˜ˆ์™ธ(uncaugt exception)๋Š” JVM์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ธฐ(UncaughtExceptionHandler)๊ฐ€ ๋ฐ›์•„์„œ ์˜ˆ์™ธ์˜ ์›์ธ์„ ํ™”๋ฉด์— ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ์—” ์ง์ ‘ try-catch๋ฌธ์„ ์ด์šฉํ•ด ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ์„œ ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์ด ์ฑ…์ž„์„ ์ง€๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

try-catch

  • if๋ฌธ๊ณผ ๋‹ฌ๋ฆฌ try๋‚˜ catch ๋ธ”๋Ÿญ ๋‚ด์— ํฌํ•จ๋œ ๋ฌธ์žฅ์ด ํ•˜๋‚˜๋ฟ์ด์–ด๋„ ๊ด„ํ˜ธ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค.

  • if-else์ฒ˜๋Ÿผ catch ๋ฌธ์„ ์—ฌ๋Ÿฌ๊ฐœ ์ ์„ ์ˆ˜ ์žˆ๊ณ  ์˜ˆ์™ธ์˜ ์ข…๋ฅ˜์™€ ์ผ์น˜ํ•˜๋Š” catch ๋ธ”๋Ÿญ์ด ์žˆ์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ์ฒ˜๋ฆฌ๋œ๋‹ค.

  • ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด try ๋ธ”๋Ÿญ์—์„œ ๋‚˜๋จธ์ง€๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

  • ์ฒ˜๋ฆฌ ๊ณผ์ •

    • ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ์— ํ•ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด ์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ๋ฌธ์žฅ์ด try-catch๋ฌธ์˜ try๋ธ”๋Ÿญ์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ด ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” catch๋ธ”๋Ÿญ์ด ์žˆ๋Š”์ง€ ์ฐพ๋Š”๋‹ค.

    • ์ฒซ๋ฒˆ์งธ catch๋ธ”๋Ÿญ๋ถ€ํ„ฐ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ catch๋ธ”๋Ÿญ์˜ ๊ด„ํ˜ธ๋‚ด์— ์„ ์–ธ๋œ ์ฐธ์กฐ๋ณ€์ˆ˜์˜ ์ข…๋ฅ˜์™€, ์ƒ์„ฑ๋œ ์˜ˆ์™ธ ์ธ์Šคํ„ด์Šค์— instanceof ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ๊ฐ€ true๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

    • ๋ชจ๋“  ์˜ˆ์™ธ๋Š” Exception ํด๋ž˜์Šค์˜ ์ž์†์ด๋ฏ€๋กœ Exception ํด๋ž˜์Šค ํƒ€์ž…์˜ ์ฐธ์กฐ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด๋†“์œผ๋ฉด ์–ด๋–ค ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์ฒ˜๋ฆฌ๋œ๋‹ค.

Method

try-catch ์‹œ ์œ ์šฉํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋Š” Exception ๋ฉ”์„œ๋“œ๋“ค

  • printStackTrace(): ์˜ˆ์™ธ ๋ฐœ์ƒ ๋‹น์‹œ์˜ Call Stack์— ์žˆ์—ˆ๋˜ ๋ฉ”์„œ๋“œ์˜ ์ •๋ณด์™€ ์˜ˆ์™ธ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ

  • getMessage(): ๋ฐœ์ƒํ•œ ์˜ˆ์™ธํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์— ์ €์žฅ๋œ ๋ฉ”์„ธ์ง€ String ๋ฐ˜ํ™˜

  • getStackTrace(): printStackTrace๋ฅผ ๋ณด์™„ํ•˜์—ฌ StackTraceElement[]๋ผ๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด๋กœ ๋ณ€๊ฒฝํ•ด์„œ ์ถœ๋ ฅํ•˜๊ณ  ์ €์žฅ

๋ฉ€ํ‹ฐ catch๋ธ”๋Ÿญ

| ๊ธฐํ˜ธ๋ฅผ ์ด์šฉํ•ด์„œ ์—ฌ๋Ÿฌ catch ๋ธ”๋Ÿญ์„ ํ•˜๋‚˜๋กœ ํ•ฉ์น  ์ˆ˜ ์žˆ๋‹ค. (|๋Š” ์—ฌ๊ธฐ์„œ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹Œ ๊ธฐํ˜ธ์ด๋‹ค.) ๊ฐœ์ˆ˜์—๋Š” ์ œํ•œ์ด ์—†๋‹ค.

try {
  ...
} catch (ExceptionA e | ExceptionB e) {
  e.printStackTrace();
}
  • | ๊ธฐํ˜ธ๋กœ ์—ฐ๊ฒฐ๋œ ์˜ˆ์™ธ ํด๋ž˜์Šค๊ฐ€ ์กฐ์ƒ๊ณผ ์ž์† ๊ด€๊ณ„๋ผ๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ. ์กฐ์ƒ ํด๋ž˜์Šค๋งŒ ์ ์–ด๋„ ๋˜๋ฏ€๋กœ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ผ๋Š” ์˜๋ฏธ์˜ ์—๋Ÿฌ๋‹ค.

์˜ˆ์™ธ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ throw

throw๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ณ ์˜๋กœ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

throw new Exception("๋ฉ”์„ธ์ง€");
// ํ˜น์€
Exception e = new Exception("๋ฉ”์„ธ์ง€");
throw e;

์ด ๋•Œ ์ƒ์„ฑ์ž์— String์„ ๋„ฃ์–ด ์ฃผ๋ฉด, ์ด String์ด Exception ์ธ์Šคํ„ด์Šค์— ๋ฉ”์„ธ์ง€๋กœ ์ €์žฅ๋˜๋ฉฐ, getMessage() ๋ฅผ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”์„œ๋“œ์— ์˜ˆ์™ธ ์„ ์–ธ throws

์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ˜„์žฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ํ˜ธ์ถœํ•œ ๊ณณ์—๋‹ค๊ฐ€ ์˜ˆ์™ธ์˜ ๋ฐœ์ƒ ์—ฌ๋ถ€๋ฅผ ํ†ต๋ณดํ•œ๋‹ค.

void method() throws Exception1, Exception2 {
  //...
}

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”์„œ๋“œ์— ์˜ˆ์™ธ ์„ ์–ธ ์‹œ RuntimeException๋“ค์€ ์ ์ง€ ์•Š๋Š”๋‹ค. ์ ์–ด๋„ ์ƒ๊ด€์€ ์—†์ง€๋งŒ ์ฒ˜๋ฆฌ๋ฅผ ์•ˆํ•ด์ค˜๋„ ๋˜๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ์ฒ˜๋ฆฌํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ์˜ˆ์™ธ๋งŒ ์„ ์–ธํ•œ๋‹ค.

์ด ๋•Œ Checked Exception์ด ๋ฉ”์„œ๋“œ์˜ ์„ ์–ธ๋ถ€์— ๋ช…์‹œ๋˜์–ด ์žˆ๋‹ค๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋˜์ง„ ๊ณ„์ธต๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•œ ๊ณ„์ธต๊นŒ์ง€์˜ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ์—์„œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ์ฒ˜๋ฆฌํ•ด๋„ ๋˜๋Š” ๊ฑด ์ž์ฒด์ ์œผ๋กœ try-catch๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ฉ”์„œ๋“œ์˜ ์ธ์ž๊ฐ€ ์ž˜๋ชป๋˜์–ด ๋‹ค์‹œ ๋ฐ›์•„์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ด ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ž์ฒด์ ์œผ๋กœ ํ•ด๊ฒฐ์ด ์•ˆ๋  ๋•Œ ์˜ˆ์™ธ๋ฅผ ๋ฉ”์„œ๋“œ์— ์„ ์–ธํ•ด์„œ ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์™€ ํ˜ธ์ถœํ•œ ์ชฝ์—์„œ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•ด์•ผํ•  ๊ฒฝ์šฐ์—”, ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€ catch๋ธ”๋Ÿญ์—์„œ ์ฒ˜๋ฆฌ ํ›„ ๋˜ throw๋ฅผ ํ•˜์—ฌ ํ˜ธ์ถœํ•œ ์ชฝ์—์„œ๋„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. (exception re-throwing)

chained exception

ํ•œ ์˜ˆ์™ธ๊ฐ€ ๋‹ค๋ฅธ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์˜ˆ์™ธ A๊ฐ€ ์˜ˆ์™ธ B๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ๋‹ค๋ฉด A๋ฅผ B์˜ ์›์ธ ์˜ˆ์™ธ๋ผ๊ณ  ํ•œ๋‹ค. ์ด ๋•Œ ์›์ธ ์˜ˆ์™ธ๋ฅผ ์ง€์ •ํ•ด์„œ ๋‹ค๋ฅธ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

try {
  
} catch (SpaceException e) {
  // ์ƒˆ๋กœ์šด ์˜ˆ์™ธ ์ƒ์„ฑ
  InstallException ie = new InstallException("์„ค์น˜์ค‘ ์˜ˆ์™ธ ๋ฐœ์ƒ");
  // ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ์›์ธ ์˜ˆ์™ธ๋กœ ์ง€์ •ํ•œ๋‹ค.
  ie.initCause(e);
  throw ie;
}

์ด ๋ฐฉ์‹์€ checked์˜ˆ์™ธ๋ฅผ unchecked ์˜ˆ์™ธ๋กœ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

throw new RuntimeException(new ChecekdException(".."));

์œ„ initCause ๋Œ€์‹ ์— RuntimeException์˜ ์ƒ์„ฑ์ž๋กœ Throwable ํƒ€์ž…์˜ ์›์ธ์„ ๋„˜๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ

  • Exception์ด๋‚˜ RuntimeException์„ ์ƒ์†ํ•ด์„œ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉด ์ƒˆ๋กœ์šด ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ๋ณด๋‹ค ๊ธฐ์กด์˜ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜์ž.

  • ์ด ๋•Œ Exception์„ ์ƒ์†ํ•ด์•ผํ• ๊นŒ RuntimeException์„ ์ƒ์†ํ•ด์•ผํ• ๊นŒ?

    • Exception์„ ์ƒ์†ํ•˜๋ฉด Checked์˜ˆ์™ธ๋กœ ๊ผญ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•œ๋‹ค.


๐Ÿ“Œ ์˜ˆ์™ธ ์ž˜ ์“ฐ๊ธฐ

try-with-resources๋ฅผ ์ด์šฉํ•˜์ž

์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” close๋ฅผ ํ˜ธ์ถœํ•ด ์ง์ ‘ ๋‹ซ์•„์ค˜์•ผ ํ•˜๋Š” ์ž์›์ด ๋งŽ๋‹ค.

  • InputStream, OutputStream, Connection ๋“ฑ

์ž์›์ด ๋‹ซํž˜์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด try-finally๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๋‹ค. finally ๋ธ”๋Ÿญ์„ ์‚ฌ์šฉํ•˜๋ฉด try-catch ๋ฌธ๊ณผ ํ•จ๊ป˜ ์˜ˆ์™ธ์˜ ๋ฐœ์ƒ์—ฌ๋ถ€์— ์ƒ๊ด€์—†์ด ์‹คํ–‰๋˜์–ด์•ผํ•  ์ฝ”๋“œ๋ฅผ ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. try๋‚˜ catch ๋ธ”๋Ÿญ์—์„œ return๋ฌธ์ด ์‹คํ–‰๋˜๋”๋ผ๋„ finally ๋ธ”๋Ÿญ์€ ์‹คํ–‰๋œ๋‹ค.

ํ•˜์ง€๋งŒ finally๋ฌธ์—์„œ๋„ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

InputStream in = null;
try {
  in = new FileInputStream(src);
} catch (FileNotFoundException e) {
  throw new RuntimeException(e);
} finally {
  try {
    in.close();
  } catch (IOException e) {
    throw new RuntimeException(e);
  }
}

์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ ธ์„œ ๋ณด๊ธฐ ์ข‹์ง€ ์•Š๊ณ , ๋” ๋‚˜์œ ๊ฑด try๋ธ”๋Ÿญ๊ณผ finally๋ธ”๋Ÿญ์—์„œ ๋ชจ๋‘ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด try ๋ธ”๋Ÿญ์˜ ์˜ˆ์™ธ๊ฐ€ ๋ฌด์‹œ๋œ๋‹ค. ๊ทธ๋Ÿผ StackTrace ๋‚ด์—ญ์— ์ฒซ๋ฒˆ์งธ ์˜ˆ์™ธ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‚จ์ง€ ์•Š์•„ ๋””๋ฒ„๊น…์ด ์–ด๋ ค์šธ ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ์ ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ” 7์—์„œ try-with-resources๊ฐ€ ๋‚˜์™”๋‹ค.

๊ฐ์ฒด๊ฐ€ AutoCloseable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์„œ close() ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋†จ๋‹ค๋ฉด, try-with-resources๋ฌธ์— ์˜ํ•ด ์ž๋™์œผ๋กœ close()๊ฐ€ ํ˜ธ์ถœ ๋œ๋‹ค.

try( InputStream in = new FileInputStream(src)) {
  //...
} catch (FileNotFoundException e) {
  throw new RuntimeException(e);
} catch (IOException e) {
  throw new RuntimeException(e);
}

ํ›จ์”ฌ ์ฝ๊ธฐ ์ˆ˜์›”ํ•˜๊ณ , try ๋ธ”๋Ÿญ ๋‚ด์™€ close์‹œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ ์ค‘์— try ๋ธ”๋Ÿญ ๋‚ด์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๊ฐ€ ๊ธฐ๋ก๋œ๋‹ค. ๋˜ํ•œ close์‹œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๊ฐ€ ์—†์–ด์ง€๋Š” ๊ฒŒ ์•„๋‹ˆ๊ณ  ์Šคํƒ ์ถ”์  ๋‚ด์—ญ์— Suppressed๋กœ ๋‚จ๊ณ , Throwable ์˜ getSuppressed ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค.

Checked Exception?

์ž๋ฐ”์˜ ์ •์„ -> unchecked ์˜ˆ์™ธ๋ฅผ ๋” ์‚ฌ์šฉํ•˜๋Š” ์ถ”์„ธ

๋ฉ”์„œ๋“œ์˜ ์„ ์–ธ๋ถ€์— ์˜ˆ์™ธ๋ฅผ ์„ ์–ธํ•˜๋ฉด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์ด ์„ ์–ธ๋ถ€๋ฅผ ๋ณด๊ณ  ์‰ฝ๊ฒŒ ์—์ธกํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ์กด์—” ์–ด๋–ค ์ข…๋ฅ˜์˜ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ง€ ์ถฉ๋ถ„ํžˆ ์˜ˆ์ธกํ•˜๊ธฐ ํž˜๋“ค์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž๋ฐ”์—์„  ๋ฉ”์„œ๋“œ ์„ ์–ธ๋ถ€์— ์˜ˆ์™ธ๋ฅผ ๋ช…์‹œํ•˜์—ฌ ๋ฉ”์„œ๋“œ caller์—๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ•์š”ํ•˜๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์˜ ์ง์„ ๋œ์–ด์ฃผ๊ณ , ๋ณด๋‹ค ๊ฒฌ๊ณ ํ•œ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

๊ธฐ์กด์—” ์ฃผ๋กœ Exception์„ ์ƒ์†๋ฐ›์•„ Checked ์˜ˆ์™ธ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์ง€๋งŒ, ์š”์ฆ˜์€ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋„๋ก RuntimeException์„ ์ƒ์†๋ฐ›์•„ ์ž‘์„ฑํ•˜๋Š” ์ชฝ์œผ๋กœ ๋ฐ”๋€Œ์–ด๊ฐ€๊ณ  ์žˆ๋‹ค. Checked ์˜ˆ์™ธ๋Š” ๋ฐ˜๋“œ์‹œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋ฏ€๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋„ try-catch๋ฌธ์„ ๋„ฃ์–ด์„œ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ž๋ฐ”๊ฐ€ ์ฒ˜์Œ ํƒ„์ƒํ–ˆ์„ ๋•Œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฒฝํ—˜์ด ์ ์€ ์‚ฌ๋žŒ๋“ค๋„ ๋ณด๋‹ค ๊ฒฌ๊ณ ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ•์ œํ•œ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์š”์ฆ˜์€ ์ž๋ฐ”๊ฐ€ ํƒ„์ƒํ•˜๋˜ ์•ฝ 20๋…„ ์ „๊ณผ ๋งŽ์ด ๋‹ฌ๋ผ์กŒ๋‹ค. ๊ทธ ๋•Œ ์ž๋ฐ”๋ฅผ ์„ค๊ณ„ํ•˜๋˜ ์‚ฌ๋žŒ๋“ค์€ ์ฃผ๋กœ ๊ฐ€์ „์ œํ’ˆ, ๋ฐ์Šคํฌํƒ‘์—์„œ ์‹คํ–‰๋  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ์ง€๋งŒ ํ˜„์žฌ๋Š” ๋ชจ๋ฐ”์ผ์ด๋‚˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ถ„์•ผ์—์„œ ์ฃผ๋กœ ์“ฐ์ธ๋‹ค.

์ด์ฒ˜๋Ÿผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ™˜๊ฒฝ์ด ๋‹ฌ๋ผ์ง„ ๋งŒํผ ํ•„์ˆ˜์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ๋งŒ ํ•  ๊ฒƒ ๊ฐ™์•˜๋˜ ์˜ˆ์™ธ๋“ค์ด ์„ ํƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด๋„ ๋˜๋Š” ์ƒํ™ฉ์œผ๋กœ ๋ฐ”๋€Œ๊ณค ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ unchecked ์˜ˆ์™ธ๊ฐ€ ๋” ํ™˜์˜๋ฐ›๊ณ  ์žˆ๋‹ค.

If a client can reasonably be expected to recover from an exception, make it a checked exception. If a client cannot do anything to recover from the exception, make it an unchecked exception.

  • ๋งŒ์•ฝ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์˜ˆ์™ธ๋ฅผ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์˜ˆ์ƒ๋˜๋Š” ๊ฒฝ์šฐ checked exception.

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด unchecked exception

๋งŒ์•ฝ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ž๋กœ ๋„˜๊ฒจ์ค€ ํŒŒ์ผ ์ด๋ฆ„์„ ์ด์šฉํ•ด์„œ ์ž‘๋™ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ผ๋ฉด, ํŒŒ์ผ ์ด๋ฆ„์ด ํ‹€๋ ธ์„ ๋•Œ Checked Exception์„ ๋ฐ˜ํ™˜ํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์ชฝ์—์„œ ๋‹ค๋ฅธ ํŒŒ์ผ ์ด๋ฆ„์„ ์ฃผ๊ฑฐ๋‚˜, ์•Œ๋งž๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํด๋ฆฐ์ฝ”๋“œ: Use Unchecked Exceptions -> Checked๋Š” ๊ทธ๋ƒฅ ์“ฐ์ง€๋งˆ

  • Checked Exception์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๋Š” ์ด์œ 

    • ์—†์–ด๋„ ๊ฒฌ๊ณ ํ•˜๊ฒŒ ์ž‘์„ฑ ๊ฐ€๋Šฅ

      ์ฒ˜์Œ ์ž๋ฐ”์—์„œ checked exception์ด ์†Œ๊ฐœ๋์„ ๋•Œ๋Š” ๊ต‰์žฅํžˆ ์ข‹์€ ์•„์ด๋””์–ด ๊ฐ™์•˜๋‹ค. ๋ฌผ๋ก  ์กฐ๊ธˆ์˜ ์ด๋“์€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์ œ checked exception์ด ์—†์ด๋„ '๊ฒฌ๊ณ ํ•œ' ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒŒ ๋ฐํ˜€์กŒ๋‹ค. C#, C++, Python, ์ตœ์‹  JVM ์–ธ์–ด ๋“ฑ์€ checked exception์ด ์—†์ง€๋งŒ ๊ฒฌ๊ณ ํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

    • OCP ์›์น™ ์œ„๋ฐฐ & ์บก์Аํ™” ๊นจ์ง

      Checked Exception์€ OCP ์›์น™์„ ์œ„๋ฐฐํ•œ๋‹ค. ๋งŒ์•ฝ ๋ฉ”์„œ๋“œ์—์„œ checked exception์„ throwํ•˜๋ฉด ๊ทธ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋˜ ํ˜ธ์ถœํ•˜๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ์— catch๋‚˜ throw๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ๋‹จ์ˆœํžˆ ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ ๋ฟ ์•„๋‹ˆ๋ผ, low ๋ ˆ๋ฒจ์—์„œ ์–ด๋–ค ์˜ˆ์™ธ๋ฅผ throwํ•˜๋Š” ์ง€๋ฅผ ์ƒ์œ„ ๋ ˆ๋ฒจ๊นŒ์ง€ ๋‹ค ์•Œ๊ณ  ์žˆ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋˜๋ฏ€๋กœ ์บก์Аํ™”๊ฐ€ ๊นจ์ง€๊ฒŒ ๋œ๋‹ค.

  • ์•„์ฃผ ์ค‘์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋Š” ์œ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์—์„œ๋Š” Checked Exception์œผ๋กœ ์ธํ•œ ๋น„์šฉ์ด ์ด์ต์„ ๋›ฐ์–ด ๋„˜๋Š”๋‹ค.

์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” -> Checked๋Œ€์‹  ๋นˆ Optional์€ ์–ด๋–จ๊นŒ?

  • ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด๋ฉด Checked, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ผ๋ฉด Unchecked. ํ™•์‹คํ•˜์ง€ ์•Š์œผ๋ฉด Unchecked. Checked ์˜ˆ์™ธ๋ผ๋ฉด ๋ณต๊ตฌ์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๋ฉ”์„œ๋“œ๋„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.

  • Checked ์˜ˆ์™ธ๋ฅผ ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ •์„ฑ์ด ๋†’์•„์ง€์ง€๋งŒ ๋‚จ์šฉํ•˜๋ฉด ๋ถˆํŽธํ•ด์ง„๋‹ค. ๋˜ํ•œ Checked ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”์„œ๋“œ๋Š” stream ์•ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒ€์‚ฌ ์˜ˆ์™ธ๋ฅผ ํšŒํ”ผํ•ด๋ณด์ž.

    • ๊ฒ€์‚ฌ ์˜ˆ์™ธ ๋Œ€์‹  ๋นˆ Optional์„ ๋ฐ˜ํ™˜ํ•˜์ž.

    • Optional๋งŒ์œผ๋กœ๋Š” ์ƒํ™ฉ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์—†์„ ๋•Œ๋งŒ Checked Exception๊ณผ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋„ ์ œ๊ณตํ•˜์ž.

์ฝ”ํ‹€๋ฆฐ ์ธ ์•ก์…˜

  • ์ตœ์‹  JVM ์–ธ์–ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฝ”ํ‹€๋ฆฐ์€ checked์™€ unchecked ์˜ˆ์™ธ๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ์‹ค์ œ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์€ ์˜๋ฏธ ์—†๋Š” ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ฑฐ๋‚˜ ๊ทธ๋ƒฅ ๋ฌด์‹œํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ค์ œ๋กœ๋Š” ์˜ค๋ฅ˜ ๋ฐœ์ƒ์„ ๋ฐฉ์ง€ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

    • Stream, Reader ๋“ฑ์„ closeํ•  ๋•Œ IOException์€ ์ฒดํฌ ์˜ˆ์™ธ์ด๋ฏ€๋กœ ์žก์•„์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ์—†์œผ๋ฏ€๋กœ ๋Œ€๋ถ€๋ถ„ ๋ฌด์‹œํ•œ๋‹ค.

    • ๋ฌธ์ž๋ฅผ ์ˆซ์ž๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค๊ฑฐ๋‚˜ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” NumberFormatException์€ ์ฒดํฌ์˜ˆ์™ธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ์ž…๋ ฅ๊ฐ’์ด ์ž˜๋ชป๋˜๋Š” ๊ฒฝ์šฐ๋Š” ํ”ํžˆ ์žˆ๋Š” ์ผ์ด๋ฏ€๋กœ ์˜คํžˆ๋ ค ์ด๊ฑธ ์žก์•„๋‚ด์•ผ ํ•œ๋‹ค.

  • ๋”ฐ๋ผ์„œ ์ฝ”ํ‹€๋ฆฐ์€ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ฒŒ ์„ค๊ณ„๋˜์—ˆ๋‹ค.

๊ฒฐ๋ก  โ‰๏ธ

  • Checked ์˜ˆ์™ธ๋Š” ์•ต๊ฐ„ํ•˜๋ฉด ์“ฐ์ง€๋ง๊ณ  ์จ์•ผํ•  ๋•Œ๋Š” ๋นˆ Optional์„ ์จ๋ณด์ž. ๊ทธ๋ž˜๋„ ์จ์•ผํ•  ๋•Œ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ™์ด ์ œ๊ณตํ•ด์ฃผ์ž.

์˜ˆ์™ธ ํ™œ์šฉ๋ฒ• - ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”

ํ‘œ์ค€ ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ (Item 72)

์˜ˆ์™ธ๋„ ์ง์ ‘ ์ •์˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ‘œ์ค€ ์˜ˆ์™ธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  • ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์˜ˆ์™ธ๋“ค

    • IllegalArgumentException: ํ˜ธ์ถœ์ž๊ฐ€ ์ธ์ž๋กœ ๋ถ€์ ์ ˆํ•œ ๊ฐ’ ๋„˜๊ธธ ๋•Œ

      • ์˜ˆ: ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— ์Œ์ˆ˜

    • IllegalStateException : ๋Œ€์ƒ ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ์— ์ ํ•ฉํ•˜์ง€ ์•Š์„ ๋•Œ

      • ์˜ˆ: ์ œ๋Œ€๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค ํ•จ

    • ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์œ„ ๋‘๊ฐœ๋กœ ํ‰์น  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํŠน์ˆ˜ํ•œ ์ƒํ™ฉ์—์„œ๋Š” ํ•ด๋‹นํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜์ž.

      • null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋ฐ null ๊ฐ’์„ ๊ฑด๋„ธ๋‹ค -> IllegalArgumentException๋ณด๋‹ค๋Š” NPE

      • ์–ด๋–ค ์‹œํ€€์Šค์˜ ํ—ˆ์šฉ ๋ฒ”์œ„๋ฅผ ๋„˜๋Š” ๊ฐ’ -> IndexOutOfBoundsException

    • UnsupportedOperationException : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๋™์ž‘์„ ๋Œ€์ƒ ๊ฐ์ฒด๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š์„ ๋•Œ. ๋ณดํ†ต ๊ฐ์ฒด๋Š” ์ž์‹ ์ด ์ •์˜ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๋‹ˆ ํ”ํ•˜์ง„ ์•Š๋‹ค. ๋ณดํ†ต์€ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์„œ๋“œ ์ผ๋ถ€๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์„ ๋•Œ ์“ด๋‹ค.

      • ์˜ˆ: ์›์†Œ๋ฅผ ๋„ฃ์„ ์ˆ˜๋งŒ ์žˆ๋Š” List ๊ตฌํ˜„์ฒด์— ๋ˆ„๊ฐ€ remove ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

์ถ”์ƒํ™” ์ˆ˜์ค€์— ๋งž๋Š” ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ๋ผ (Item 73)

์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ์ผ๊ณผ ๊ด€๋ จ ์—†์–ด ๋ณด์ด๋Š” ์˜ˆ์™ธ๊ฐ€ ํŠ€์–ด๋‚˜์˜ค๋ฉด ๋‹นํ™ฉ์Šค๋Ÿฌ์šธ ๊ฒƒ์ด๋‹ค. ์ด๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์ €์ˆ˜์ค€ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๊นฅ์œผ๋กœ ์ „ํŒŒํ•ด๋ฒ„๋ฆด ๋•Œ ์ข…์ข… ์ผ์–ด๋‚œ๋‹ค. ์ด๋Š” ๋‚ด๋ถ€ ๊ตฌํ˜„ ๋ฐฉ์‹์„ ๋“œ๋Ÿฌ๋‚ด์–ด ์œ— ๋ ˆ๋ฒจ API๋ฅผ ์˜ค์—ผ์‹œํ‚จ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๋ ค๋ฉด ์ƒ์œ„ ๊ณ„์ธต์—์„œ๋Š” ์ €์ˆ˜์ค€ ์˜ˆ์™ธ๋ฅผ ์žก์•„ ์ž์‹ ์˜ ์ถ”์ƒํ™” ์ˆ˜์ค€์— ๋งž๋Š” ์˜ˆ์™ธ๋กœ ๋ฐ”๊ฟ” ๋˜์ ธ์•ผ ํ•œ๋‹ค. -> ์˜ˆ์™ธ ๋ฒˆ์—ญ(exception translation)

๊ทธ๋ฆฌ๊ณ  ์ €์ˆ˜์ค€ ์˜ˆ์™ธ๊ฐ€ ๋””๋ฒ„๊น…์— ๋„์›€์ด ๋œ๋‹ค๋ฉด exception chaining์„ ์‚ฌ์šฉํ•˜์ž. ๊ทธ๋Ÿผ Throwable์˜ getCausea ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•˜๋ฉด ์ €์ˆ˜์ค€ ์˜ˆ์™ธ๋ฅผ ๊บผ๋‚ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๊ณ  ์˜ˆ์™ธ ๋ฒˆ์—ญ์„ ๋‚จ์šฉํ•ด์„  ์•ˆ๋œ๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด ์ €์ˆ˜์ค€ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์„ฑ๊ณตํ•˜๋„๋ก ํ•ด์„œ ์•„๋ž˜ ๊ณ„์ธต์—์„  ์—์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•˜์ž.

  • ์ƒ์œ„ ๊ณ„์ธต ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ์•„๋ž˜ ๊ณ„์ธต ๋ฉ”์„œ๋“œ๋กœ ๊ฑด๋„ค๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ๋„ ์ข‹๋‹ค.

์˜ˆ์™ธ๋ฅผ ๋ฌด์‹œํ•˜์ง€ ๋ง๋ผ (Item 77)

try๋ฌธ์œผ๋กœ ๊ฐ์‹ผ ํ›„ catch ๋ธ”๋ก์—์„œ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š” ๊ฒŒ ์˜ˆ์™ธ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ์˜ˆ์™ธ๋ฅผ ๋ฌด์‹œํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋ฉด (Stream์„ ๋‹ซ์„ ๋•Œ์ฒ˜๋Ÿผ) catch ๋ธ”๋ก ์•ˆ์— ๊ทธ๋ ‡๊ฒŒ ๊ฒฐ์ •ํ•œ ์ด์œ ๋ฅผ ์ฃผ์„์œผ๋กœ ๋‚จ๊ธฐ๊ณ  ์˜ˆ์™ธ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ignored๋กœ ์‚ฌ์šฉํ•˜์ž.

try {
  //..
} catch (FirstException | SecondException ignored) {
  //์–ด์ฉŒ๊ตฌ์ €์ฉŒ๊ตฌ
}

-> ํ•„์š”ํ•  ๋•Œ ๊ตฌ๋ถ„ํ•ด์„œ ์“ฐ๊ธฐ

๊ธฐ๋ณธ ๊ฐœ๋…
ํ”„๋กœ๊ทธ๋žจ ์—๋Ÿฌ
ํ”„๋กœ๊ทธ๋žจ ์—๋Ÿฌ์˜ ์ข…๋ฅ˜
์‹คํ–‰ ๋„์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ
Exception๊ณผ Error ํด๋ž˜์Šค์˜ ์ƒ์† ๊ตฌ์กฐ
Error
Exception
Exception Handling
try-catch
์˜ˆ์™ธ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ throw
๋ฉ”์„œ๋“œ์— ์˜ˆ์™ธ ์„ ์–ธ throws
chained exception
์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ
์˜ˆ์™ธ ์ž˜ ์“ฐ๊ธฐ
try-with-resources๋ฅผ ์ด์šฉํ•˜์ž
Checked Exception?
์˜ˆ์™ธ ํ™œ์šฉ๋ฒ• - ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”
ํ‘œ์ค€ ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ (Item 72)
์ถ”์ƒํ™” ์ˆ˜์ค€์— ๋งž๋Š” ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ๋ผ (Item 73)
์˜ˆ์™ธ๋ฅผ ๋ฌด์‹œํ•˜์ง€ ๋ง๋ผ (Item 77)
Oracle Java Documentation