[Java] 예외의 정의와 종류, 실행 예외(RuntimeException) 알아보기

    프로그램 오류

    프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우가 있다. 이러한 경ㄹ과를 초래하는 원인을 프로그램 에러 또는 오류라고 한다. 이를 발생시점에 따라 컴파일 에러(compile-time error)와 런타임 에러(runtime error)로 나눌 수 있는데 컴파일 시에 발생하는 에러는 컴파일 할 때 발생하는 에러이고 프로그램의 실행도중에 발생하는 에러를 런타임 에러라고 한다. 이 외에도 논리적 에러(logical error)가 있는데, 컴파일도 잘되고 실행도 잘되지만 의도한 것과 다르게 동작하는 것을 말한다.



    자바 에러(Error)와 예외(Exception)

    자바에서는 실행 시 발생할 수 있는 프로그램 오류를 에러와 예이 두 가지로 구분하였다. 컴퓨터 하드웨어의 오작동 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것을 자바에서는 에러(Error)라고 하고, 에러는 메모리 부족이나 스택오버플로우와 같이 일단 발생하면 복구할 수 없는 심각한 오류이고, 예는 발생하더라도 수습될 수 있는 비교적 덜 심각한 것이다. 즉, 에러는 JVM 실행에 문제가 생긴 것이므로 개발자가 대처할 방법이 없다. 하지만 예외(Exception)는 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 말한다. 예외가 발생되면 프로그램은 곧바로 종료된다는 점에서는 에러와 동일하다. 그러나 예외는 예외처리를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있다. 



    예외처리하기

    프로그램 실행도중에 발생하는 에러는 어쩔 수 없지만, 예외는 프로그래머가 이에 대한 처리를 미리 해주어야 한다. 예외처리란, 프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것이며, 예외처리의 목적은 예외의 발생으로 인한 실행중인 프로그램의 갑작스런 비정상 종료를 막고, 정상적인 실행상태를 유지할 수 있도록 하는 것이다.


    예외처리(exception handling) 의

    정의 - 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것

    목적 -  프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것



    예외 종류

    예외에는 두 가지 종류가 있다. 하나는 일반 예외이고, 다른 하나는 실행 예외이다. 일반 예외는 컴파일러 체크 예외라고도 하는데, 자바 소스를 컴파일하 는 과정에서 예외 처리 코드가 필요한지 검사하기 때문이다. 만약 예외 처리 코드가 없다면 컴파일 오류가 발생한다. 실행 예외는 컴파일하는 과정에서 예외 처리 코드를 검사하지 않는 예외를 말한다. 컴파일 시 예외처리를 확인하는 차이일 뿐, 두 가지 예외는 모두 예외 처리가 필요하다. 자바에서는 예외를 클래스로 관리한다. JVM은 프로그램을 실행하는 도중에 예외가 발생하면 해당 예외 클래스로 객체를 생성한다. 그리고 나서 예외 처리 코드에서 예외 객체를 이용할 수 있도록 해준다. 모든 예외 클래스들은 다음과 같이 java.lang.Exception 클래스를 상속받는다.


    일반 예외와 실행 예외 클래스를 구별하는 방법은 일반 예외는 Exception을 상속받니만 RuntimeException을 상속받지 않는 클래스들이다. 실행예외는 그 반대이다. JVM은 RuntimeException을 상속했는지 여부를 보고 실행 예외를 판단한다.




    실행 예외(RuntimeException클래스를 상속받은 클래스들)

    실행 예외는 자바 컴파일러가 체크를 하지 않기 떄문에 개발자의 경험에 의해서 예외 처리 코드를 삽입해야 한다. 만약 개발자가 실행 예외에 대해 예외 처리 코드를 넣지 않았을 경우, 해당 예외가 발생하면 프로그램은 곧바로 종료된다. 다음 실행 예외 종류를 보고 언제 발생되고, 어떤 오류 메시지가 출력되는지 잘 알아보도록 하자 숙련된 개발자라면 오류메시지를 보고 바로 오류를 해결할 수 있어야 한다.




    실행 예외 종류


    NullPointerException

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


    public class NullPointerExceptionExample {
        public static void main(String[] args) {
            String data = null;
            System.out.println(data.toString());
        }
    }
    cs


    data는 지금 null값을 가지고 있기 떄문에 String 객체를 참조하고 있지 않다. 그래서 String 객체의toString() 메소드르 호출하면 NullPointerException이 발생한다.



    ArrayIndexOutOfBoundsException

    배열에서 인덱스 범위를 초과하여 사용할 경우인 에러이다.


    public class ArrayIndexOutOfBoundsExceptionExample {
        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[] 배열안에 아무 값도 없기 때문에 ArrayIndexOutOfBoundsException 에러가 발생한다. 이 에러를 없애려면 Run - Run Configurations를 선택한수 Arguments 탭의 Program arguments 입력란에 매개 값을 입력한다.



    Run시킬 때 args[] 배열안에 배열, 인덱스 값을 넣어서 매개변수로 사용하게 해줄 수 있다.



    NumberFormatExcpeion

    문자열로 되어 있는 데이터를 숫자로 변경하는 경우가 자주 발생한다. 문자열을 숫자로 변환하는 방법은 여러 가지가 있지만 가장 많이 사용되는 코드는 


    - Integer.parseInt(String s)

    - Double.parseDouble(String s)


    이렇게 두가지가 있다. 주어진 문자열을 정수, 실수로 변환해주는 메소드이다. 이 메소드들은 매개값인 문자열이 숫자로 변환될 수 있다면 숫자를 리턴하지만, 숫자로 변환될 수 없는 문자가 포함되어 있다면 NumberFormatException을 발생시킨다.


    public class NumberFormatExceptionExample {
        public static void main(String[] args) {
            String data1 = "100";
            String data2 = "a100";
            
            int value1 = Integer.parseInt(data1);
            int value2 = Integer.parseInt(data2);
            
            int result = value1 + value2;
            //System.out.println(data1 + " +" data2 + "=" result);
        }
    }
    cs


    String data1의 값은 문자열 100이지만 String data2는 a100이다. 문자열 100은 성공적으로 정수로 변환이 되었지만 반면 a100의 문자열을 정수로 변환하려고 할때 에러가 난다. 에러메시지는 바로 NumberFormatExcption이다. 



    ArithmeticException

    산술연산 에러이고  0으로 나눌 때 에러가 발생한다.


    public class ArithmeticException {
        public static void main(String[] args) {
            int i = 1;
            int j = 0;
            System.out.println(i/j);
        }
    cs



    이 외에도 여러 RuntimeException이 있으므로 참고하도록 하자




    신용권, 이것이 자바다, 한빛미디어

    남궁성, 자바의 정석, 도우 출판


    댓글

    Designed by JB FACTORY