ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Live Study - Java Exception
    Hello, World πŸ’»/Java β˜•οΈ 2021. 1. 23. 12:54

    ν”„λ‘œκ·Έλž¨ 였λ₯˜, Error / Exception의 차이

    ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰ 쀑에 μ–΄λ–€ μ›μΈμœΌλ‘œ μ˜€μž‘λ™ν•˜κ±°λ‚˜, μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ§€ μ•ŠλŠ” κ²½μš°κ°€ μžˆλ‹€. μ—¬κΈ°μ„œ 'μ–΄λ–€ 원인'을 μ—λŸ¬(Error) ν˜Ήμ€ 였λ₯˜(Exception)라고 ν•œλ‹€.

    μ—λŸ¬μ™€ 였λ₯˜μ˜ μ°¨μ΄λŠ” 뭘까?

    μ—λŸ¬, Error

    μ—λŸ¬λŠ” μ‹œμŠ€ν…œ λ ˆλ²¨μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν•œ 경우λ₯Ό λ§ν•œλ‹€. λ©”λͺ¨λ¦¬ λΆ€μ‘±(OutOfMemoryError), μŠ€νƒμ˜€λ²„ν”Œλ‘œμš°(StackOverflowError)와 같이 μ΄λŸ¬ν•œ μ—λŸ¬κ°€ λ°œμƒν•˜λ©΄ 볡ꡬ할 수 μ—†λŠ” μ‹¬κ°ν•œ 였λ₯˜μ΄λ‹€. 

    μ˜ˆμ™Έ, Exception

    μ˜ˆμ™ΈλŠ” μ‚¬μš©μžκ°€ ν”„λ‘œκ·Έλž¨μ„ 잘 λͺ» μ‚¬μš©ν–ˆκ±°λ‚˜, ν”„λ‘œκ·Έλž˜λ¨Έμ˜ μ‹€μˆ˜λ‘œ μΈν•œ 문제λ₯Ό λ§ν•œλ‹€. μ–΄λ–€ 수λ₯Ό 0으둜 λ‚˜λˆ΄κ±°λ‚˜(ArithmeticException) λ°°μ—΄μ˜ 크기λ₯Ό λ²—μ–΄λ‚˜μ„œ μ ‘κ·Ό(IndexOutOfBoundException)ν•˜λ €κ³  ν–ˆμ„ λ•Œ λ°œμƒν•˜λŠ” 였λ₯˜λ₯Ό λ§ν•œλ‹€. μ˜ˆμ™ΈλŠ” μ—λŸ¬μ™€ 달리 μ˜ˆμ™Έ 처리λ₯Ό 톡해 ν”„λ‘œκ·Έλž¨μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜λŠ” 것을 막고, 정상적인 μ‹€ν–‰μƒνƒœλ₯Ό μœ μ§€μ‹œν‚¬ 수 μžˆλ‹€.

     

    μžλ°”κ°€ μ œκ³΅ν•˜λŠ” μ˜ˆμ™Έ 계측 ꡬ쑰

     

     

    λͺ¨λ“  클래슀의 쑰상은 Object μ΄λ―€λ‘œ Exception, Error 클래슀 μ—­μ‹œ Object 클래슀λ₯Ό 상속받고 μžˆλ‹€.

    λͺ¨λ“  μ˜ˆμ™Έμ˜ 졜고 쑰상은 Exception ν΄λž˜μŠ€μ΄λ‹€. 
    κ·Έλ¦Όμ—μ„œ λ³Ό 수 μžˆλ“―, Exception 클래슀λ₯Ό μƒμ†λ°›λŠ” ν΄λž˜μŠ€λ“€μ€ 두 개의 그룹으둜 λ‚˜λˆŒ 수 μžˆλ‹€.
    - RuntimeException ν΄λž˜μŠ€μ™€ μžμ‹ ν΄λž˜μŠ€λ“€, unchecked μ˜ˆμ™Έ
    - κ·Έ μ™Έμ˜ ν΄λž˜μŠ€λ“€, checked μ˜ˆμ™Έ

    RuntionException ν΄λž˜μŠ€μ™€ μžμ‹ν΄λž˜μŠ€λ“€μ„ unchecked μ˜ˆμ™ΈλΌκ³  λΆ€λ₯΄κ³ , κ·Έ μ™Έμ˜ ν΄λž˜μŠ€λ“€μ„ checked 라고 ν•œλ‹€.
    Exception 클래슀λ₯Ό μƒμ†λ°›λŠ” μ˜ˆμ™Έ ν΄λž˜μŠ€λ“€μ€ μ˜ˆμ™Έ μ²˜λ¦¬κ°€ ν•„μˆ˜λ‹€. 반면 RuntimeException 을 상속받은 μ˜ˆμ™Έ ν΄λž˜μŠ€λ“€μ€ μ˜ˆμ™Έ μ²˜λ¦¬κ°€ ν•„μˆ˜λ‘œ κ°•μ œλ˜μ§€λŠ” μ•ŠλŠ”λ‹€. μ˜ˆμ™Έ μ²˜λ¦¬κ°€ κ°•μ œλ˜λƒμ˜ κΈ°μ€€μœΌλ‘œ checked, unchecked 둜 λ‚˜λ‰˜λŠ”λ° μžμ„Έν•œ λ‚΄μš©μ€ μ•„λž˜(throw, throws λΆ€λΆ„)에 μžˆλ‹€.

    μžλ°”μ—μ„œ μ˜ˆμ™Έ 처리 방법

    1) try - catch - finally

    μ˜ˆμ™ΈλŠ” μ˜ˆμ™Έ 처리λ₯Ό 톡해 ν”„λ‘œκ·Έλž¨μ˜ 비정상적인 λ™μž‘μ„ 막고 정상적인 μƒνƒœλ₯Ό μœ μ§€μ‹œν‚¬ 수 μžˆλ‹€κ³  ν–ˆλ‹€. μžλ°”μ—μ„œλŠ” 이런 μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ try, catch, finally ꡬ문을 μ œκ³΅ν•œλ‹€.

    try {
        // μ˜ˆμ™Έκ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” μ½”λ“œ
    }
    catch (ExampleException1 e1) {
        // ExampleException1 이 λ°œμƒν•œ 경우 λŒ€μ‘ν•˜λŠ” μ½”λ“œ
    }
    catch (ExampleException2 e2) {
        // ExampleException2 이 λ°œμƒν•œ 경우 λŒ€μ‘ν•˜λŠ” μ½”λ“œ
    }
    ...
    finally {
        // μ˜ˆμ™Έ λ°œμƒ 여뢀와 상관없이 μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” μ½”λ“œ μž‘μ„±
    }


    μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆλŠ” μ½”λ“œλ₯Ό try-catch 문으둜 κ°μ‹Έμ„œ μ˜ˆμ™Έ 처리λ₯Ό ν•  수 μžˆλ‹€. try λΈ”λŸ­μ—λŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³ , catch λΈ”λŸ­μ—λŠ” μ–΄λ–€ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ 경우 λŒ€μ‘ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€. λ§ˆμ§€λ§‰ finally λΈ”λŸ­μ—λŠ” μ˜ˆμ™Έ λ°œμƒ 여뢀와 상관없이 μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€.

    μ΄λ•Œ catch, finally 문은 ν•„μˆ˜κ°€ μ•„λ‹ˆλ‹€. μƒλž΅μ΄ κ°€λŠ₯ν•˜λ‹€. ν•˜μ§€λ§Œ try 문을 μ‚¬μš©ν•  λ•Œ finally 문을 μƒλž΅ν•˜λŠ” κ²½μš°λŠ” μžˆμ–΄λ„ catch 문을 μƒλž΅ν•˜λŠ” κ²½μš°λŠ” 거의 없을 것 κ°™λ‹€. 그리고 catch 문은 μ˜ˆμ‹œμ²˜λŸΌ μ—¬λŸ¬λ²ˆ μ‚¬μš©κ°€λŠ₯ν•˜λ‹€. λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έμ˜ 경우의 수 만큼 μ‚¬μš©κ°€λŠ₯ν•˜λ‹€.

    μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ, 첫번째 catch λ¬Έ λΆ€ν„° μ°¨λ‘€λ‘œ λ‚΄λ €κ°€λ©΄μ„œ μ„ μ–Έλœ μ˜ˆμ™Έ ν΄λž˜μŠ€μ™€, μƒμ„±λœ μ˜ˆμ™Έ 클래슀의 μΈμŠ€ν„΄μŠ€μ— instanceof μ—°μ‚°μžλ₯Ό μ΄μš©ν•΄μ„œ κ²€μ‚¬ν•˜κ²Œ λœλ‹€. 검사 κ²°κ³Όκ°€ true 인 catch λΈ”λŸ­μ„ λ§Œλ‚  λ•Œ κΉŒμ§€ 검사가 κ³„μ†λœλ‹€.

    try λ¬Έμ—μ„œ λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έλ₯Ό catch λ¬Έμ—μ„œ μž‘μ§€ λͺ»ν•œ 경우, 예λ₯Όλ“€μ–΄ ExampleException3 이 λ°œμƒν•œ κ²½μš°μ— catch λΈ”λŸ­μ—μ„œ ExampleException3 을 catch ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•  수 μ—†λ‹€. λ°œμƒν•  수 μžˆλŠ” 경우λ₯Ό 생각에 catch 문을 잘 μž‘μ„±ν•΄μ•Ό ν•œλ‹€.

    또 μ£Όμ˜ν•΄μ•Ό ν•  것은 μ˜ˆμ™Έ 클래슀의 상속 ꡬ쑰λ₯Ό 잘 μƒκ°ν•΄μ„œ catch 문의 μˆœμ„œλ₯Ό 잘 μž‘μ„±ν•΄μ•Ό ν•œλ‹€.
    λΆ€λͺ¨ - μžμ‹ κ΄€κ³„μ˜ μ˜ˆμ™Έ ν΄λž˜μŠ€κ°€ μžˆλŠ”λ°, λΆ€λͺ¨ μ˜ˆμ™Έ 클래슀λ₯Ό λ¨Όμ € catch ν•˜κ²Œ 되면 μžμ‹ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆλ”λΌλ„, λΆ€λͺ¨ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ΄λ‹€.

    같은 이유둜 catch 문의 λ§ˆμ§€λ§‰μ— 졜고 쑰상 클래슀인 Exception 클래슀λ₯Ό catch ν•˜κ³  있으면 μ–΄λ–€ μ’…λ₯˜μ˜ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ”λΌλ„ μ˜ˆμ™Έ 처리λ₯Ό ν•  수 μžˆλ‹€.


    try, catch, finally 문은 {} λΈ”λŸ­ 내에 ν•œ λ¬Έμž₯만 μ‚¬μš©ν•΄λ„ κ΄„ν˜Έλ₯Ό μƒλž΅ν•  수 μ—†λ‹€. 

    μ½”λ“œμ˜ 흐름

    try λΈ”λŸ­ λ‚΄μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•œ 경우
    => λ°œμƒν•œ μ˜ˆμ™Έμ™€ μΌμΉ˜ν•˜λŠ” catch λΈ”λŸ­μ΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.
    => μΌμΉ˜ν•˜λŠ” catch λΈ”λŸ­μ„ 찾게 되면, κ·Έ catch λΈ”λŸ­μ˜ λ¬Έμž₯을 μˆ˜ν–‰ν•˜κ³  전체 try, catch 문을 λΉ μ Έλ‚˜μ˜¨λ‹€.
    => finally λΈ”λŸ­μ΄ 있으면 ν•΄λ‹Ή μ½”λ“œλ₯Ό μˆ˜ν–‰ν•œλ‹€.

    public static int tryMethod() {
        int result;
        
        try {
            System.out.println("Try Block");
            result = 5 / 0; // <- μ˜ˆμ™Έ λ°œμƒ, μ˜ˆμ™Έ
            System.out.println("After Exception"); // μˆ˜ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.
        } catch (ArithmeticException e) {
            System.out.println("Catch Block");
        }
        finally {
            System.out.println("Finally Block");
            result = 0;
        }
    
        return result;
    }
    
    // μ‹€ν–‰ κ²°κ³Ό
    Try Block
    Catch Block
    Finally Block


    try λΈ”λŸ­ λ‚΄μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ€ 경우
    => try λΈ”λ‘μ˜ μˆ˜ν–‰μ΄ λλ‚˜λ©΄ try-catch 문을 λΉ μ Έλ‚˜μ˜¨λ‹€.
    => finally λΈ”λŸ­μ΄ 있으면 ν•΄λ‹Ή μ½”λ“œλ₯Ό μˆ˜ν–‰ν•œλ‹€.

    try λΈ”λŸ­κ³Ό finally λΈ”λŸ­μ— return 문이 μžˆλ‹€λ©΄ μ–΄λ–€ 값이 return 될까?

    public class Main {
    
        public static void main(String[] args) {
            System.out.println(tryMethod());
        }
    
        public static int tryMethod() {
            int result;
    
            try {
                result = 5;
                return result;
            } catch (Exception e) {
                System.out.println("Catch Block");
            }
            finally {
                result = 10;
                return result;
            }
        }
    
    }


    μœ„ μ˜ˆμ‹œμ˜ κ²°κ³ΌλŠ” 5 일까 10일까? κ²°κ³ΌλŠ” 10 이닀. try λ¬Έκ³Ό finally λ¬Έ λͺ¨λ‘μ— return 문이 μžˆλŠ” 경우 finally 에 μžˆλŠ” 값이 λ°˜ν™˜λœλ‹€. 5 이지 μ•Šμ„κΉŒ μƒκ°ν–ˆλŠ”λ°, finally 의 10 μ΄μ–΄μ„œ μž‘μ„±ν•΄λ‘”λ‹€. 컴파일된 κ²°κ³Όλ₯Ό λ³΄λ‹ˆ try λΈ”λŸ­μ˜ return 문은 없어지고, finally λΈ”λŸ­μ˜ return 문만 λ‚¨μ•„μžˆλŠ” 것을 ν™•μΈν–ˆλ‹€. μ•„λž˜λŠ” .class 파일의 일뢀.

    public static int tryMethod() {
        try {
            int result = true;
        } catch (Exception var5) {
            System.out.println("Catch Block");
        } finally {
            byte var7 = 10;
            return var7;
        }
    }

     

    finally μ—μ„œ return 을 μ“°λŠ”κ±΄ μ•ˆν‹°νŒ¨ν„΄ 이라고 ν•œλ‹€. 


    λ©€ν‹° catch λΈ”λŸ­

    JDK 1.7 λΆ€ν„° catch λΈ”λŸ­μ„ | 기호λ₯Ό μ΄μš©ν•΄ ν•˜λ‚˜μ˜ catch λΈ”λŸ­μœΌλ‘œ ν•©μΉ  수 있게 λ˜μ—ˆλ‹€. μ€‘λ³΅λœ μ½”λ“œλ₯Ό 쀄일 수 μžˆκ² λ‹€.
    μ΄λ•Œ | λŠ” 논리 μ—°μ‚°μžκ°€ μ•„λ‹ˆλΌ κΈ°ν˜Έμ΄λ‹€.

    try {
        // μ˜ˆμ™Έκ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” μ½”λ“œ
    }
    catch (ExampleException1 | ExampleException2 e) {
        // ExampleException1 ν˜Ήμ€ ExampleException2 이 λ°œμƒν•œ 경우 λŒ€μ‘ν•˜λŠ” μ½”λ“œ
    }


    μ΄λ•Œ | 기호둜 μ—°κ²°λœ μ˜ˆμ™Έ ν΄λž˜μŠ€κ°€ λΆ€λͺ¨-μžμ‹μ˜ 관계에 μžˆλ‹€λ©΄ 컴파일 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.
    그리고 μ˜ˆμ™Έ ν΄λž˜μŠ€μ— κ±Έλ¦¬λŠ” μˆœμ„œλ„ μ•žμ—μ„œ λΆ€ν„° 걸리게 λœλ‹€.

    2) throw, throws

    μ˜ˆμ™Έ 처리의 λ‹€λ₯Έ 방법은 μ˜ˆμ™Έλ₯Ό λ˜μ§€λŠ” 것이닀. μœ„μ˜ try-catch 문을 μ‚¬μš©ν•΄ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법은 μ–΄λ–€ μ½”λ“œλ₯Ό μˆ˜ν–‰ν•˜λ‹€κ°€ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ ν•΄λ‹Ή μ½”λ“œ λΆ€λΆ„μ—μ„œ try-catch 문으둜 μ˜ˆμ™Έμ— λŒ€ν•΄ λŒ€μ‘ν•˜λŠ” λ°©λ²•μ΄μ—ˆλ‹€.

    throw, throws 문은 μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ, μ˜ˆμ™Έκ°€ λ°œμƒν•œ 뢀뢄이 μ•„λ‹ˆλΌ λ‹€λ₯Έ κ³³(ν˜ΈμΆœν•œ κ³³)μ—μ„œ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό μ‹œν‚€λŠ” 방법이닀.

    μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” 방법, throw

    throw ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆλ‹€.

    Exception err = new Exception("Error Message"); // new ν‚€μ›Œλ“œλ‘œ μ˜ˆμ™Έ μΈμŠ€ν„΄μŠ€ 생성 ν›„
    throw err; // throw ν‚€μ›Œλ“œλ‘œ μ˜ˆμ™Έλ₯Ό λ˜μ§„λ‹€. (λ°œμƒμ‹œν‚¨λ‹€.)
    
    throw new Exception("Error Message"); // ν•œ μ€„λ‘œ μ“Έ μˆ˜λ„ μžˆλ‹€.

    throws λ₯Ό 더 μ•Œμ•„λ³΄κΈ° 전에 checked, unchecked μ˜ˆμ™Έμ— λŒ€ν•΄ μ•Œκ³  λ„˜μ–΄κ°€λ©΄ μ’‹κ² λ‹€.

    checked μ˜ˆμ™Έ, unchecked μ˜ˆμ™Έ

    μ˜ˆμ™Έ 처리λ₯Ό κ°•μ œν•˜λƒ, μ•ˆν•˜λƒμ˜ 차이둜 checked, unchecked μ˜ˆμ™Έλ‘œ λ‚˜λ‰œλ‹€κ³  ν–ˆλ‹€. Exception 의 ν•˜μœ„ ν΄λž˜μŠ€λ“€ 쀑 RuntimeException 클래슀λ₯Ό 상속받은 μ˜ˆμ™Έ ν΄λž˜μŠ€λ“€μ„ unchecked 라고 λΆ€λ₯΄κ³ , RuntimeException ν΄λž˜μŠ€λ“€ 상속 받지 μ•Šμ€ μ˜ˆμ™Έ ν΄λž˜μŠ€λ“€μ„ checked μ˜ˆμ™ΈλΌκ³  λΆ€λ₯Έλ‹€.

    unchecked μ˜ˆμ™ΈλŠ” ν”„λ‘œκ·Έλž˜λ¨Έμ˜ μ‹€μˆ˜λ‘œ λ°œμƒλ˜λŠ” 것듀이기 λ•Œλ¬Έμ— μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό κ°•μ œν•˜μ§€ μ•ŠλŠ”λ‹€.
    λ§Œμ•½ unchecked μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆλŠ” μ½”λ“œμ— μ˜ˆμ™Έ 처리λ₯Ό ν•΄μ€˜μ•Ό λœλ‹€λ©΄ λ°°μ—΄, μ°Έμ‘° λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” λͺ¨λ“  μ½”λ“œμ— try-catch 문으둜 IndexOutOfBoundException, NullPointerException 처리λ₯Ό ν•΄μ€˜μ•Ό 될 것이닀.

    try {
        int nums[] = new int[10];
        nums[5] = 5;
    }
    catch (IndexOutOfBoundsException e) {
        // ..
    }
    catch (NullPointerException e) {
        // ..
    }

     

    λ©”μ„œλ“œμ— μ˜ˆμ™Έ μ„ μ–Έν•˜κΈ°, throws

    try-catch λ₯Ό μ„ μ–Έν•΄μ„œ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•˜λŠ” λŒ€μ‹ , λ©”μ„œλ“œμ— λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έλ₯Ό μ„ μ–Έν•΄μ„œ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ μͺ½μ—μ„œ μ˜ˆμ™Έ 처리λ₯Ό μ‹œν‚¬ 수 μžˆλ‹€.
    λ©”μ„œλ“œμ˜ 선언뢀에 throws ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ λ©”μ„œλ“œ λ‚΄μ—μ„œ λ°œμƒν•  수 μžˆλŠ” ν‚€μ›Œλ“œλ₯Ό μž‘μ„±ν•˜λ©΄ λœλ‹€. μ˜ˆμ™Έκ°€ μ—¬λŸ¬ 개인 경우 μ‰Όν‘œλ‘œ (,) 둜 κ΅¬λΆ„ν•΄μ„œ μž‘μ„±ν•˜λ©΄ λœλ‹€.

    public File readFile(String filePath) throws FileNotFoundException, OtherException {
        // ..
    }


    λ©”μ„œλ“œμ— μ˜ˆμ™Έλ₯Ό μ„ μ–Έν•  λ•Œ, 일반적으둜 unchecked μ˜ˆμ™ΈλŠ” μž‘μ„±ν•˜μ§€ μ•ŠλŠ”λ‹€. unchecked μ˜ˆμ™Έλ₯Ό 선언해도 λ¬Έμ œκ°€ λ˜μ§€λŠ” μ•Šμ§€λ§Œ 보톡 λ°˜λ“œμ‹œ μ²˜λ¦¬ν•΄μ•Όν•  μ˜ˆμ™Έλ“€λ§Œ μ„ μ–Έν•œλ‹€.

    λ©”μ„œλ“œ λ‚΄μ—μ„œ λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έλ₯Ό 선언뢀에 μž‘μ„±ν•΄μ„œ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” μͺ½μ—μ„œλŠ” μ˜ˆμ™Έ 처리λ₯Ό κ°•μš”ν•˜κΈ° λ•Œλ¬Έμ— μ’€ 더 μ•ˆμ „ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 있게 λœλ‹€.

    void method1() throws Exception {
        method2();
    }
    
    void method2() throws Exception {
        throw new Exception();
    }

    μ˜ˆμ™ΈλŠ” method1, method2 처럼 계속 throws 둜 λ„˜κ²¨μ€„ 수 μžˆλ‹€.

    3) try - with - resources λ¬Έ

    JDK 1.7 λΆ€ν„° try - catch 문의 λ³€ν˜•μΈ try-with-resources 문이 μΆ”κ°€λ˜μ—ˆλ‹€.

    μ–΄λ–€ ν΄λž˜μŠ€λ“€μ€ (특히 파일 μž…μΆœλ ₯에 μ‚¬μš©λ˜λŠ”) μ‚¬μš©ν•œ 후에, μ‚¬μš©ν•œ μžμ›μ„ λ°˜ν™˜ν•˜κΈ° μœ„ν•΄ κΌ­ λ‹«μ•„μ€˜μ•Ό ν•˜λŠ” ν΄λž˜μŠ€λ“€μ΄ μžˆλ‹€.

    void readFile(String filePath) {
        FileInputStream fis = null;
        DataInputStream dis = null;
    
        try {
            fis = new FileInputStream(filePath);
            dis = new DataInputStream(fis);    
        }
        catch (IOException err) {
            err.printStackTrace();
        }
        finally {
            fis.close();
            dis.close();
        }
    }


    μœ„ μ˜ˆμ‹œλŠ” λ¬Έμ œκ°€ μžˆλ‹€. finally λΈ”λŸ­μ— μžˆλŠ” close λ©”μ„œλ“œλŠ” IOException μ˜ˆμ™Έκ°€ λ°œμƒν•  수 있기 λ•Œλ¬Έμ— try-catch 문으둜 처리λ₯Ό ν•΄μ€˜μ•Ό ν•œλ‹€.

    void readFile(String filePath) {
        FileInputStream fis = null;
        DataInputStream dis = null;
    
        try {
            fis = new FileInputStream(filePath);
            dis = new DataInputStream(fis);    
        }
        catch (IOException err) {
            err.printStackTrace();
        }
        finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
    	    }
            if (dis != null) {
                try {
                    dis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    μœ„μ™€ 같이 finally λΈ”λŸ­μ²˜λŸΌ null 체크 후에, try-catch 문으둜 μ˜ˆμ™Έ 처리λ₯Ό ν•΄μ€˜μ•Ό λ¬Έμ œκ°€ μ—†λŠ” μ½”λ“œκ°€ λœλ‹€.
    이 λ•Œ try-with-resources ꡬ문을 μ‚¬μš©ν•˜λ©΄ λ³΅μž‘ν•œ μœ„μ˜ μ½”λ“œλ₯Ό κ°„λ‹¨νžˆ λ§Œλ“€ 수 μžˆλ‹€.

    void readFile(String filePath) {
        try (FileInputStream fis = new FileInputStream(filePath);
            DataInputStream dis = new DataInputStream(fis)) {
            // ..
        }
        catch (IOException err) {
            err.printStackTrace();
        }
    }


    훨씬 κΉ”λ”ν•΄μ‘Œλ‹€. try ν‚€μ›Œλ“œμ˜ () 에 객체λ₯Ό μƒμ„±ν•˜λŠ” λ¬Έμž₯을 λ„£μœΌλ©΄ ν•΄λ‹Ή κ°μ²΄λŠ” try λΈ”λŸ­μ„ λ²—μ–΄λ‚˜λŠ” μˆœκ°„ μžλ™μ μœΌλ‘œ close() κ°€ ν˜ΈμΆœλœλ‹€. κ·Έ λ‹€μŒμ— catch λ‚˜ finally λΈ”λŸ­μ΄ μˆ˜ν–‰λœλ‹€. 

    try () 에 λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 것도 κ°€λŠ₯ν•˜κ³  try λΈ”λŸ­ λ‚΄μ—μ„œλ§Œ μ‚¬μš©κ°€λŠ₯ν•˜λ‹€. 그리고 μœ„ 처럼 두 개 μ΄μƒμ˜ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  경우 μ„Έλ―Έ 콜둠으둜 κ΅¬λΆ„ν•΄μ„œ μ„ μ–Έν•  수 μžˆλ‹€.

    μ΄λ ‡κ²Œ μžλ™μœΌλ‘œ close() κ°€ μžλ™μœΌλ‘œ 호좜될 수 있으렀면 ν΄λž˜μŠ€κ°€ AutoCloseable μ΄λΌλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 것이어야 ν•œλ‹€. 

    class CloseableClass implements AutoCloseable {
    
        public void doSomething() {
            System.out.println("Do Something..");
        }
    
        @Override
        public void close() throws Exception {
            System.out.println("Close action");
        }
    
    }

     

    μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ λ§Œλ“€κΈ°

    기쑴의 μ •μ˜λœ μ˜ˆμ™Έ 클래슀 외에 ν•„μš”μ— 따라 ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μƒˆλ‘œμš΄ μ˜ˆμ™Έ 클래슀λ₯Ό μ •μ˜ν•  수 μžˆλ‹€. μ˜ˆμ™Έ 처리λ₯Ό κ°•μ œν•˜κ³  μ‹ΆμœΌλ©΄ Exception 클래슀λ₯Ό, μ˜ˆμ™Έ 처리λ₯Ό μ„ νƒμ μœΌλ‘œ ν•˜κ³  싢은 κ²½μš°μ—” RuntimeException 클래슀λ₯Ό 상속 λ°›μœΌλ©΄ λœλ‹€.

    class CheckedException extends Exception {
        CheckedException(String msg) {
            super(msg);
        }
    }
    
    class UncheckedException extends RuntimeException {
        UncheckedException(String msg) {
            super(msg);
        }
    }


    ν•„μš”μ— 따라 μ˜ˆμ™Έ 클래슀λ₯Ό μž‘μ„±ν•  μˆ˜λŠ” μžˆμ§€λ§Œ, κ°€λŠ₯ν•˜λ©΄ μžλ°”μ—μ„œ μ œκ³΅ν•˜λŠ” μ˜ˆμ™Έ 클래슀λ₯Ό 적극 ν™œμš©ν•˜λŠ” 것을 μΆ”μ²œν•œλ‹€.
    (μ΄νŽ™ν‹°λΈŒ μžλ°” Item 72)

    μ•„λž˜λŠ” μ΄νŽ™ν‹°λΈŒ μžλ°”μ— λ‚˜μ˜¨ 정리 ν‘œ. 

    IllegalArgumentException ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” 값이 λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λ˜μ—ˆμ„ λ•Œ
    IllegalStateException 객체가 λ©”μ„œλ“œλ₯Ό μˆ˜ν–‰ν•˜κΈ° μ μ ˆν•˜μ§€ μ•Šμ€ μƒνƒœμΌ λ•Œ
    NullPointerException null 을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” λ©”μ„œλ“œμ— null 을 μ „λ‹¬ν–ˆμ„ λ•Œ
    IndexOutOfBoundsException μΈλ±μŠ€κ°€ λ²”μœ„λ₯Ό λ„˜μ–΄μ„°μ„ λ•Œ
    ConcurrentModificationException ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” λ™μ‹œ μˆ˜μ •μ΄ λ°œκ²¬λμ„ λ•Œ
    UnsupportedOperationException ν˜ΈμΆœν•œ λ©”μ„œλ“œλ₯Ό μ§€μ›ν•˜μ§€ μ•Šμ„ λ•Œ 



    References

    μžλ°”μ˜ 정석 (www.yes24.com/Product/Goods/24259565)
    μ΄νŽ™ν‹°λΈŒ μžλ°” (www.yes24.com/Product/Goods/65551284)

    'Hello, World πŸ’» > Java β˜•οΈ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

    Live Study - Java Interface  (0) 2021.01.07
    Live Study - Java Package  (0) 2020.12.30
    Live Study - Java 상속 (Inheritance)  (0) 2020.12.23
    Live Study - Java 의 Class  (0) 2020.12.14
    Live Study - Java 선택문, 반볡문  (0) 2020.12.06
Designed by Tistory.