ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 예외 처리 - 예외 & 실행 예외
    CSE/Java 2016. 4. 21. 09:55

    예외처리는 여러 절로 구성되어 있습니다.



    예외와 예외 클래스 & 실행 예외

    예외 처리 코드 

    자동 리소스 닫기 & 예외 넘기기(Throw)

    사용자 정의 예외




    예외와 예외 클래스

     PC 하드웨어의 오작동 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것을 자바에서는 에러(error)라고 합니다. 에러는 JVM 실행에 문제가 생겼다는 것이므로 JVM 위에서 실행되는 프로그램을 아무리 견고하게 만드렁도 결국 실행 불능이 됩니다.


     자바에서는 에러 이외에 예외(Exception)라는 오류가 있습니다. 예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 말합니다.(대부분 개발자의 fault 이긴 하지만)

     

     예외가 발생되면 프로그램은 곧바로 종료된다는 점에서는 에러와 동일하지만, 예외는 예외 처리(Exception Handling)를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있습니다.


     예외는 일반 예외와 실행 예외가 존재합니다. 


     일반 예외는 컴파일러 체크 예외라고도 하는데, 자바 소스를 컴파일하는 과정에서 예외 처리 코드가 필요한지 검사하기 때문입니다.


     실행 예외는 컴파일하는 과정에서 예외 처리 코드를 검사하지 않은 예외를 말합니다. 컴파일 시 예외 처리를 확인하는 차이일 뿐, 두 가지 예외는 모두 예외 처리가 필요합니다. 


     자바에서는 예외를 클래스로 관리합니다. JVM은 프로그램을 실행하는 도중에 예외가 발생하면 해당 예외 클래스로 객체를 생성합니다. 그리고 나서 예외 처리 코드에서 예외 객체를 이용할 수 있도록 해줍니다. 모든 예외 클래스들은 다음과 같이 java.lang.Exception 클래스를 상속받습니다.



     






     일반 예외와 실행 예외 클래스를 구별하는 방법은 일반 예외는 Exception을 상속받지만 RuntimeException을 상속받지 않는 클래스들이고, 실행 예외는 RuntimeException을 상속받는 클래스들입니다. 








    실행 예외

     실행 예외는 자바 컴파일러가 체크를 하지 않기 때문에 오로지 개발자의 경험에 의해서 예외 처리 코드를 삽입해야 합니다.



     NullPointerException

      이 예외는 객체 참조가 없는 상태, 즉 null 값을 갖는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생합니다. 객체가 없는 상태에서 객체를 사용하려 했으니 예외가 발생하는 것입니다.



     * NullPointerExceptionExam.java


     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package except;
     
     
    public class NullPointerExceptionExam {
     
        public static void main(String[] args) {
            String data = null;
            System.out.println(data.toString());
        }
     
    }
     
     
     
    cs







      프로그램에서 예외가 발생하면 예외 메세지가 이클립스 Console 뷰에 출력되면서 프로그램이 종료됩니다. Console 뷰에 출력되는 내용에는 어떤 예외가 어떤 소스의 몇 번째 코드에서 발생했는지에 대한 정보가 들어있습니다.




     ArrayIndexOutOfBoundsException

      배열에서 인덱스 범위를 초과해서 사용할 경우 실행 예외인 java.lang.ArrayIndexOutOfBoundsException이 발생합니다. 


     * ArrayIndexOutOfBoundsExam.java


     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    package except;
     
     
    public class ArrayIndexOutOfBoundsExam {
     
        public static void main(String[] args) {
            String data1 = args[0];
            String data2 = args[1];
     
            System.out.println("args[0] : " + data1);
            System.out.println("args[1] : " + data2);
        }
     
    }
     
     
     
    cs








      위의 예제를 실행하면 파라미터를 주지 않았기에 args[0], args[1]과 같이 인덱스를 사용 할 수 없습니다.



     NumberFormatException

      프로그램을 개발하다보면 문자열로 되어있는 데이터를 숫자로 변경하는 경우가 있습니다. 이 메서드들은 파라미터인 문자열이 숫자로 변환될 수 있다면 숫자를 리턴하지만, 숫자로 변환될 수 없는 문자가 포함되어 있다면 java.lang.NumberFormatException을 발생시킵니다.


     * NumberFormatExam.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    package except;
     
     
    public class NumberFormatExam {
     
        public static void main(String[] args) {
            String correctData = "100";
            String wrongData = "a100";
            
            int correctValue = Integer.parseInt(correctData);
            int wrongValue = Integer.parseInt(wrongData);
        }
     
    }
     
     
     
    cs

     







      a100 이라는 변수는 숫자로 변환될 수 없기에 위와같은 예외를 발생시키는 것 입니다.



     ClassCastException

      타입 변환(Casting)은 상위 클래스와 하위 클래스 간에 발생하고 구현 클래스와 인터페이스 간에도 발생합니다. 이러한 관계가 아니면 클래스는 다른 클래스로 타입 변환할 수 없습니다. 


      아래 예제는 타입 변환간에 발생하는 ClassCastException을 보여주는 예제입니다.


     * ClassCastExam.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    package except;
     
     
    public class ClassCastExam {
        public static void main(String[] args) {
            Dog dog = new Dog();
            changeDog(dog);
            
            Cat cat = new Cat();
            changeDog(cat);
            
        }
        
        public static void changeDog(Animal animal) {
            Dog dog = (Dog) animal;    //ClassCastException 발생 가능
        }
    }
     
    class Animal {}
    class Dog extends Animal {}
    class Cat extends Animal {}
     
     
     
    cs








      라인 9를 보시면 Cat 객체를 파라미터로 주어서 Dog로 변환하려 했기에 예외가 발생하는 것 입니다.





    end




     * 신용권의 '이것은 자바다'를 참조한 포스팅입니다.

    댓글

Designed by Tistory.