ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바의 예외(Exception)란 무엇일까?
    Java 2018. 7. 26. 12:40
    반응형





    코딩을 하다보면 항상 만나는 ~~~.Exception ,,,,

    볼때마다 답답하고,, 숨이 막히는데요

    이번에 Exception에 대해 알아보겠습니다.

      


    * 노란 박스 - Checked Exception

    * 파란 박스 - Unecked Exception



    0. Exception vs Error  

      1) 에러(Error) 

         - 시스템에서 비정상적인 상황이 생겼을 때 발생한다. 

         - 시스템 레벨에서 발생하기 때문에 개발자가 미리 예측하여 처리할 수 없는 심각한 오류입니다.

      2) 예외(Exception)

         - 개발자가 구현한 코드에서 발생하기 때문에 미리 예측하고 코드에 의해 수습될 수 있는 오류입니다.

      3) Checked Exception vs Unchecked Exception

         - Checked 와 Uncheked의 가장 큰 차이는 명시적으로 예외를 처리하는지 안하는지의 차이를 가집니다.

        ① Checked Exception : RuntimeException 클래스에 상속하지 않은 것들이고, 예외가 발생할 수 있는 메소드를 사용할 경우

                                              반드시 catch문이나 throw를 정의해서 처리해야 합니다.

        ② Unchecked Exception : 프로그램이 실행된 후에 확인할 수 있고, 프로그램의 오류가 있을 때 발생하도록 의도된 것입니다.

               



             

    1. 예외 (Exception) 란?

      - 자바 프로그램 실행 시 발생할 수 있는 예외를 말합니다.

      - JVM이 프로그램 실행시 Exception 상황을 만나면 해당 Exception을 발생시키고 프로그램을 즉시 종료합니다.





    2. 예외처리 (Exception Handling) 란?

      - JVM이 Exception을 발생시켜 전달할 때 적절한 Try와 Catch 구문으로 

        해당 Exception에 대한 적절한 대처 방안을 실행하고 프로그램을 정상적으로 지속시키기 위한 작업을 말합니다.

       




    3. try, catch, finally, throw, throws 키워드

      1) try : Exception 발생 예상 코드 영역을 지정합니다.

      2) catch : Exception 처리, Exception에 대한 대처 방안을 실행합니다.

         2-1) printStackTrace() getMessage()란?

                ① printStackTrace() : 예외 발생 시의 호출스택에 있었던 메소드의 정보와 예외 메시지를 출력합니다.

                ② getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있습니다.

      3) finally : finally 영역은 Exception 발생 및 처리여부와 관계없이 항상 실행합니다.

      4) throw : new 연산자를 이용해 고의로 Exception 을 발생시킨다.

      5) throws : 예외가 발생한 지점에 try문으로 처리하지 않아도, 호출한 영역(곳)으로 Exception을 발생하면 던질 수 있다는 의미입니다.





    4. 예외 처리 예제

      1) 예제1 ( try - catch 문 )

      ▶ 아래 예제에서 ArrayList에 add메소드를 통해 "사과"와 "배"를 추가하였지만 list.get(2)를 통해 가지고 있는 범위를 초과하려고 합니다.

           그렇기 때문에 ① try문 내에서 IndexOutOfBoundsException이 발생합니다. 하지만 ②의  발생한 예외와 일치하는 catch문을 확인합니다.

           ③에서 일치하는 catch문을 찾은 뒤 해당하는 catch문 내의 명령을 실행하고 ④try - catch문을 빠져나갑니다. 

           결과화면을 보면 프로그램이 정상적으로 수행됨을 알 수 있습니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import java.util.ArrayList;
     
    public class TestException {
        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<String>();
            list.add("사과");
            list.add("배");
            
            // 하나의 try 블럭에 대한 catch는 여러개 정의 가능합니다.
            // 구체적인 예외(자식) -> 추상적 예외(부모) 순으로 명시해야 합니다.
            try { 
                System.out.println(list.get(2));
            } catch(IndexOutOfBoundsException ie) {
                System.out.println("리스트 요소 범위를 초과하였습니다.");
            } catch (Exception e) {
                e.printStackTrace();
            }
                System.out.println("프로그램이 정상 실행하였습니다.");
        }
    }
     
    cs

      ※ 결과화면


      2) 예제2 ( 사용자 정의 예외, throw, throws 사용 )

      ▶ 아래 예제에서 사용자 정의로 예외를 만들었습니다. Exception 클래스에서 상속을 받고 예외 처리시 보여줄 message를 설정해줍니다.

          serialVersionUID란 static final 상수는 general serial version 이라는 애인데요. 이 아이에 대한 설명은 다음으로 미루겠습니다. ^^;;

          InvalidAgeExeption() 은 기본 메세지를 보여주기 위한 의도이고, InvalidAgeException(String message)는 상세하게 보여주기 위한 의도입니다.

          super() 대신 System.out.println으로 콘솔창에 잘못된 정보를 보여줄 수 있지 않나라고 생각하실 수 있지만, 웹같은 경우를 예로 들면

          예외에 대한 내용을 보통 팝업창으로 띄어 사용자에게 보여주지만, System.out.println은 팝업창에 메세지를 띄어서 보여줄 수 없는 차이가 있습니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class InvalidAgeException extends Exception {
        private static final long seralVersionUID = 4606001480844065202L;
        public InvalidAgeException() {
            super("잘못된 나이 정보입니다.");
        }
        public InvalidAgeException(String message) {
            super(message);
        }
    }    
     
    cs

      ▶  아래 예제에서 ① Peroson 객체에 올바르지 않은 나이 정보를 넘깁니다. 올바르지 않은 나이로 인해 예외가 발생할 것을 예상해서 

            ② InvalidAgeException을 throw하여 예외를 발생시킵니다. ③ 또한 throws을 명시해서 예외가 발생 시 호출하는 곳으로 전달시킵니다.

            호출한 곳에서 예외가 발생하였기 때문에 ④catch문안에 InvalidAgeException 클래스에서 검사하고 예외처리합니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    /*
     * throws : 메서드 선언부 마지막에 명시하고 해당 메서드 실행 시 발생되는 예외를 호출한 곳으로 던질 수 있다는 의미의 키워드
     * throw : 특정 조건이 충족될 경우 예외를 발생시킨다.
     */
    class Person{
        private int age;
        // throws 를 명시해서 예외 발생시 호출한 곳으로 전달 
        public void setAge(int age) throws InvalidAgeException {
            if(age>0)
                this.age=age;
            else //잘못된 나이이므로 InvalidAgeException 발생
                throw new InvalidAgeException(age+" 나이 정보가 아닙니다.");
        }
        public int getAge() {
            return age;
        }    
    }
    public class TestException2 {
        public static void main(String[] args) {
            Person p=new Person();
            try {
                p.setAge(-1);
                System.out.println("나이:"+p.getAge());
            } catch (InvalidAgeException e) {            
                //e.printStackTrace();
                System.out.println(e.getMessage());
            }
        }
    }
     
    cs

      ※ 결과화면



        

    반응형
Designed by Tistory.