ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] μžλ°” μ˜ˆμ™Έμ²˜λ¦¬
    Android/Java 2021. 2. 1. 23:01
    λ°˜μ‘ν˜•
    • 이 글은 "μžλ°” 온라인 μŠ€ν„°λ””" κ³΅λΆ€ν•˜μ—¬ μž‘μ„±ν•œ κΈ€μž…λ‹ˆλ‹€.

    Error(μ—λŸ¬) vs Exception(μ˜ˆμ™Έ)

     

    μžλ°”μ˜ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό μ„€λͺ…ν•˜κΈ° 이전에 μ—λŸ¬μ™€ μ˜ˆμ™Έλ₯Ό κ΅¬λ³„ν•œ 후에 μ„€λͺ…ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.
    μ € λ˜ν•œ μ—λŸ¬λž‘ μ˜ˆμ™Έλ₯Ό κ΅¬λ³„ν•˜μ§€ μ•Šκ³  λ˜‘κ°™λ‹€λΌλŠ” 생각을 ν–ˆμ—ˆλŠ”λ° 이번 μŠ€ν„°λ””λ₯Ό 톡해 μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

    Error(μ—λŸ¬)

    • μ—λŸ¬λŠ” 컴퓨터 ν•˜λ“œμ›¨μ–΄ μ˜€λ™μž‘ λ˜λŠ” κ³ μž₯으둜 μΈν•΄μ„œ μ‘μš©ν”„λ‘œκ·Έλž¨μ˜ 였λ₯˜κ°€ λ°œμƒν•˜κ±°λ‚˜, JVM 싀행에 λ¬Έμ œκ°€ 생겼을 κ²½μš°μ— λ°œμƒν•©λ‹ˆλ‹€.
    • λŸ°νƒ€μž„ μ‹œ λ°œμƒλ˜λ©° μ „λΆ€ 예츑 λΆˆκ°€λŠ₯ν•œ UnChecked Error μž…λ‹ˆλ‹€. κ·Έλž˜μ„œ κ°œλ°œμžκ°€ λŒ€μ²˜ν•˜λŠ” λ°©λ²•μ—λŠ” μ œν•œμ μΌ μˆ˜λ°–μ— μ—†μŠ΅λ‹ˆλ‹€.

    Exception(μ˜ˆμ™Έ)

    • λ‹¨μˆœνžˆ 개발자의 잘λͺ»λœ μ½”λ”©μœΌλ‘œ 인해 λ°œμƒν•œ ν”„λ‘œκ·Έλž¨ 였λ₯˜λ₯Ό λ§ν•©λ‹ˆλ‹€.
    • μ˜ˆμ™ΈλŠ” 개발자의 처리둜 μΈν•΄μ„œ λ‹€μ–‘ν•œ λŒ€μ²˜λ°©λ²•μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€.
    • Exception의 μ’…λ₯˜λŠ” 크게 2κ°€μ§€λ‘œ μ˜ˆμΈ‘κ°€λŠ₯ν•œ Checked Exceptionκ³Ό UnChecked Exception이 μžˆμŠ΅λ‹ˆλ‹€.



    μžλ°” Exception 계측ꡬ쑰

    • Checked Exception은 μ»΄νŒŒμΌμ„ ν•  κ²½μš°μ— μ˜ˆμΈ‘κ°€λŠ₯ν•œ μ˜ˆμ™Έλ‘œ ClassNotFoundException, FileNotFoundException 등이 μžˆμŠ΅λ‹ˆλ‹€.
    • UnChecked Exception은 λŸ°νƒ€μž„ μ‹œ λ°œμƒν•  μˆ˜λ„ 있고 λ°œμƒν•˜μ§€ μ•Šμ„ 수 μžˆλŠ” μ˜ˆμ™Έλ‘œ ArithmeticException, NullpointerException 등이 μžˆμŠ΅λ‹ˆλ‹€.



    μžλ°” μ˜ˆμ™Έμ²˜λ¦¬

    • ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜λ©΄μ„œ μ—λŸ¬μ™€ μ˜ˆμ™ΈλŠ” ν•„μ—°μ μœΌλ‘œ λ§Œλ‚˜κ²Œ λ˜λŠ” μ‘΄μž¬μž…λ‹ˆλ‹€.
    • 잘λͺ»λœ μ½”λ”©μœΌλ‘œ 인해 μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ”λΌλ„ λ¬΄μ‹œν•˜κ³  λ‹€μŒ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κ±°λ‚˜ λ‹€λ₯Έ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” κ²ƒμ²˜λŸΌ λ‹€μ–‘ν•˜κ²Œ μ‚¬μš©μžκ°€ μ›ν•˜λŠ” μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • try, catch, finally, throw, throws λ‹€μŒ ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•©λ‹ˆλ‹€.

     

    try, catch

    public class ExceptionTest {
        public static void main(String[] args) {
    
            int num = 4/0;
            System.out.println(num);
    
        }
    }

    λ‹€μŒ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•œ ν›„ μ‹€ν–‰ν–ˆλ‹€λ©΄ 4λ₯Ό 0으둜 λ‚˜λˆŒ 수 μ—†κΈ° λ•Œλ¬Έμ— ArithmeticException이 λ°œμƒν•œ κ²°κ³Όλ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜λŠ” λ°©λ²•μœΌλ‘œ try, catch ꡬ문을 μ‚¬μš©ν•©λ‹ˆλ‹€.

    public class ExceptionTest {
        public static void main(String[] args) {
    
            try{
                int num = 4/0;
                System.out.println(num);
            }catch (ArithmeticException e){
                System.out.println("ArithmeticException이 λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.");
            }
    
        }
    }

    try ꡬ문 μ•ˆμ— λ“€μ–΄μžˆλŠ” μ½”λ“œμ— λŒ€ν•΄μ„œ μ—λŸ¬ λ°œμƒ μ—¬λΆ€λ₯Ό ν™•μΈν•©λ‹ˆλ‹€. λ§Œμ•½, catch κ΄„ν˜Έ μ•ˆμ— μžˆλŠ” ArithmeticException 이 λ°œμƒν•œλ‹€λ©΄ 더 이상 tryꡬ문을 μ‹€ν–‰ν•˜μ§€ μ•Šκ³  catch 문으둜 κ°€μ„œ μ‹€ν–‰ν•˜κ²Œ λ©λ‹ˆλ‹€.
    이와 같은 λ°©λ²•μœΌλ‘œ catch 문에 λ°œμƒν•  것 같은 μ˜ˆμ™Έλ₯Ό μ„€μ •ν•˜μ—¬ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

     

    finally

    μ˜ˆμ™Έκ°€ λ°œμƒν•  κ²½μš°μ— try, catchλ₯Ό μ‚¬μš©ν•˜μ—¬ try ꡬ문을 더 이상을 μ‹€ν–‰ν•˜μ§€ μ•Šκ³  catch ꡬ문만 μ‹€ν–‰ν•˜κ²Œ λ©λ‹ˆλ‹€.
    ν•˜μ§€λ§Œ try 문에 무쑰건적으둜 μ‹€ν–‰ν•΄μ•Ό ν•˜λŠ” μ½”λ“œκ°€ μžˆμ„ κ²½μš°λ„ μžˆμŠ΅λ‹ˆλ‹€. finally ν‚€μ›Œλ“œλ‘œ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    public class ExceptionTest {
        public static void main(String[] args) {
    
            int num = 5;
            try{
                num = 4/0;
                // System.out.println(num);
            }catch (ArithmeticException e){
                System.out.println("ArithmeticException이 λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.");
            }finally {
                System.out.println(num);
            }
    
        }
    }

    숫자 num을 무쑰건 좜λ ₯은 ν•΄μ•Όν•˜λŠ” μƒν™©μ—μ„œ ArithmeticException으둜 인해 System.out.println(num) μ½”λ“œλŠ” μ‹€ν–‰ν•  μˆ˜κ°€ μ—†μŠ΅λ‹ˆλ‹€.
    무쑰건 μ‹€ν–‰ν•΄μ•Όν•˜λŠ” μ½”λ“œκ°€ μžˆλ‹€λ©΄ try문이 μ•„λ‹Œ finally λ¬Έμ•ˆμ— μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜μ—¬ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ”λΌλ„ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

     

     

    throw

    public class ExceptionTest {
    
        public void checkArithmetic(int a,int b){
            if(b==0){
                throw new ArithmeticException();
            }
            System.out.println("checkArithmetic methodκ°€ μ‹€ν–‰ν–ˆμŠ΅λ‹ˆλ‹€");
            System.out.println(a/b);
        }
    
        public static void main(String[] args) {
    
            int num = 5;
            ExceptionTest test = new ExceptionTest();
            test.checkArithmetic(num,0);
    
        }
    }

    μ΄μ „μ˜ 결과와 λ™μΌν•˜κ²Œ ArithmeticException이 λ°œμƒν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ½”λ”© μƒμ—μ„œ ArithmeticException을 λ°œμƒν•˜κ²Œ ν•˜λŠ” μ½”λ“œλŠ” μ—†μŠ΅λ‹ˆλ‹€.
    throw ν‚€μ›Œλ“œλ₯Ό 톡해 κ°œλ°œμžκ°€ 직접 bλΌλŠ” λ³€μˆ˜κ°€ 0일 κ²½μš°μ—λŠ” ArithmeticException을 λ°œμƒν•˜λ„λ‘ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    이처럼 throw ν‚€μ›Œλ“œλŠ” μ˜ˆμ™Έλ₯Ό λ°œμƒν•˜κ²Œ ν•˜λŠ” ν‚€μ›Œλ“œλΌκ³  μƒκ°ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

    public class ExceptionTest {
    
        public void checkArithmetic(int a,int b){
            try{
                if(b==0){
                    throw new ArithmeticException();
                }
                System.out.println(a/b);
            }catch (ArithmeticException e){
                System.out.println("ArithmeticExceptiondl λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€");
            }
            finally {
                System.out.println("checkArithmetic methodκ°€ μ‹€ν–‰ν–ˆμŠ΅λ‹ˆλ‹€");
            }
        }
    
        public static void main(String[] args) {
    
            int num = 5;
            ExceptionTest test = new ExceptionTest();
            test.checkArithmetic(num,0);
    
        }
    }

    이전 μ½”λ“œλ‘œ κ΅¬ν˜„ν•  경우 λ©”μ†Œλ“œκ°€ μ‹€ν–‰λ˜μ—ˆλ‹€λŠ” 좜λ ₯λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•˜μ§€ λͺ»ν•˜κ²Œ λ©λ‹ˆλ‹€. λ‹€μŒ μ½”λ“œμ²˜λŸΌ try, catch 문으둜 μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•œ ν›„ ν•„μˆ˜μ μœΌλ‘œ 좜λ ₯ν•΄μ•Όν•˜λŠ” μ½”λ“œλŠ” finally ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜λŠ” λͺ¨μŠ΅μ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

     

    throws

    throw ν‚€μ›Œλ“œλ₯Ό 톡해 μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λ©΄ λ©”μ†Œλ“œ λ‚΄λΆ€μ—μ„œ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€.
    λ©”μ†Œλ“œ λ‚΄λΆ€κ°€ μ•„λ‹Œ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œ λΆ€λΆ„μ—μ„œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€κΈ° μœ„ν•΄μ„œλŠ” throws ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

    public class ExceptionTest {
    
        public void checkArithmetic(int a,int b) throws ArithmeticException{
    
            if(b==0){
                throw new ArithmeticException();
            }
            System.out.println("checkArithmetic methodκ°€ μ‹€ν–‰ν–ˆμŠ΅λ‹ˆλ‹€");
        }
    
        public static void main(String[] args) {
    
            int num = 5;
            try{
                ExceptionTest test = new ExceptionTest();
                test.checkArithmetic(num,0);
            }catch (ArithmeticException e){
                System.out.println("ArithmeticException이 λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€");
            }
        }
    }

    throws ν‚€μ›Œλ“œλŠ” μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό λ’€λ‘œ λ―Έλ£¨λŠ” κ°œλ…μœΌλ‘œ μ‚¬μš©λ˜μ–΄μ§€λ©° try, catch문이 λ©”μ†Œλ“œ λ‚΄λΆ€κ°€ μ•„λ‹Œ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œ λΆ€λΆ„μ—μ„œ μ΄λ€„μ§€κ²Œ λ©λ‹ˆλ‹€.



    RuntimeException vs Exception

    • μœ„μ—μ„œλ„ 계속 μ„€λͺ…을 ν–ˆμ§€λ§Œ Exception을 크게 두 κ°€μ§€λ‘œ λΆ„λ₯˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • RuntimeException은 μ‹€ν–‰ μ‹œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έμ΄κ³ , Exception은 컴파일 μ‹œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έμž…λ‹ˆλ‹€.
    • 즉, μ»€μŠ€ν…€ν•œ μ˜ˆμ™Έλ₯Ό λ§Œλ“€ λ•Œ Exception은 ν”„λ‘œκ·Έλž¨ μž‘μ„± μ‹œ 이미 μ˜ˆμΈ‘κ°€λŠ₯ν•œ μ˜ˆμ™Έλ₯Ό μž‘μ„±ν•  λ•Œ μ‚¬μš©ν•˜κ³ , RuntimeException λ°œμƒν•  μˆ˜λ„ 있고 λ°œμƒν•˜μ§€ μ•Šμ„ κ²½μš°μ— μ‚¬μš©ν•©λ‹ˆλ‹€.
    • Exception을 Checked Exception, RuntimeException을 UnChecked Exception이라고 λΆ€λ¦…λ‹ˆλ‹€.
    • μ°Έμ‘°(https://wikidocs.net/229)



    μ»€μŠ€ν…€ν•œ μ˜ˆμ™Έ λ§Œλ“œλŠ” 방법

    • Exceptionκ³Ό RuntimeException을 상속받아 μƒˆλ‘œμš΄ μ˜ˆμ™Έ 클래슀λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • RuntimeExcetion을 상속받은 ν΄λž˜μŠ€λŠ” 주둜 λŸ°νƒ€μž„ μ‹œ 였λ₯˜κ°€ λ°œμƒν•˜κ±°λ‚˜ ν•˜μ§€ μ•Šμ„ κ²½μš°λ„ μžˆμŠ΅λ‹ˆλ‹€.
    • Exception을 상속받은 ν΄λž˜μŠ€λŠ” 예츑 κ°€λŠ₯ν•œ μ˜ˆμ™Έμ΄κΈ° λ•Œλ¬Έμ— 컴파일 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. try, catch 문을 μ‚¬μš©ν•˜μ—¬ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•΄μ•Ό ν•©λ‹ˆλ‹€.

     

    RuntimeException 상속

    public class ExceptionTest {
    
        public void checkArithmetic(int a,int b){
    
            if(b==0){
                throw new CustomRuntimeException();
            }
            System.out.println("checkArithmetic methodκ°€ μ‹€ν–‰ν–ˆμŠ΅λ‹ˆλ‹€");
        }
    
        public static void main(String[] args) {
            int num = 5;
            ExceptionTest test = new ExceptionTest();
            test.checkArithmetic(num,0);
        }
    
    }
    
    class CustomRuntimeException extends RuntimeException{
    }

    λ‹€μŒ μ½”λ“œμ²˜λŸΌ RuntimeException을 상속받은 κ²½μš°μ—λŠ” μ •μƒμ μœΌλ‘œ μ»΄νŒŒμΌμ„ λ©λ‹ˆλ‹€. ν•˜μ§€λ§Œ b의 값에 따라 μ˜ˆμ™Έλ₯Ό λ°œμƒν•  μˆ˜λ„ 있고 λ°œμƒν•˜μ§€ μ•Šμ„ κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€.

     

    Exception 상속

    public class ExceptionTest {
    
        public void checkArithmetic(int a,int b){
    
            try{
                if(b==0){
                    throw new CustomException();
                }
            }catch (Exception e){
                System.out.println("CustomeException이 λ°œμƒν–ˆμŠ΅λ‹ˆ");
            }
            System.out.println("checkArithmetic methodκ°€ μ‹€ν–‰ν–ˆμŠ΅λ‹ˆλ‹€");
        }
    
        public static void main(String[] args) {
            int num = 5;
            ExceptionTest test = new ExceptionTest();
            test.checkArithmetic(num,0);
        }
    
    }
    
    class CustomException extends Exception{
    }

    Exception을 μƒμ†ν•˜λŠ” 클래슀λ₯Ό μ‚¬μš©ν•  경우 try, catch 문을 쓰지 μ•Šκ³ μ„œλŠ” 컴파일 였λ₯˜λ‘œ 인해 μ‹€ν–‰μ‘°μ°¨ λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    λ°˜μ‘ν˜•
Designed by Tistory.