본문 바로가기

java

java 예외 처리 - 예외 클래스

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

 

 java.lang,Exception의 자식들로는 java.lang.RuntimeException에 속한 것과 그렇지 않은 것들이 있습니다. 여기서  java.lang.RuntimeException에 속한 하위 클래스들이 실행 예외에 속하며, 나머지는 일반 예외에 속합니다.

 

1. 실행 예외

실행 예외는 자바 컴파일러가 체크하지 않기 때문에 오로지 개발자의 경험에 의해서 예외 처리 코드를 작성해야 합니다. 만약 개발자가 실행 예외에 대해 예외 처리 코드를 넣지 않았을 경우, 해당 예외가 발생하면 프로그램은 곧바로 종료됩니다.

 

몇 가지 주요 실행 예외들

 

  • NullPointerException - null 값을 가지는 객체를 참조했을 때 발생
  • ArrayIndexOutOfBoundsException - 배열 범위를 초과했을 때 발생

package sec06.exam06;

 

public class Hello {

public static void main(String[] args) {

 

String data1 = args[0];

String data2 = args[1];

System.out.println(data1);

System.out.println(data2);

 

그냥 이 코드를 실행하면 실행 매개값이 주어지지 않았기 때문에 인덱스를 사용할 수 없습니다. 이클립스에서 [Run] - [Run Configuration] - [Arguments] 입력란에 '배열', '인덱스'라는 매개값을 입력하고 다음 코드를 실행하면 각각의 매개값이 출력됩니다.

 

package sec06.exam06;

 

public class Hello {

    public static void main(String[] args) {

        if(args.length == 2) {

            String data1 = args[0];

            String data2 = args[1];

            System.out.println(data1);

            System.out.println(data2);

        } else

            System.out.println("두 개의 실행 매개값이 필요합니다.");

        }

}

  • NumberFormatException - 문자열을 숫자로 변환할 수 없을 때 발생
  • ClassCastException - 클래스와 클래스, 클래스와 인터페이스 사이에서 타입 변환이 일어날 수 없을 때 발생

2. 예외 처리

 

try - catch - finally 블록

try 블록에는 예외 발생 가능 코드가 위치합니다. try 블록에서 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이동하여 예외 처리 코드를 실행합니다.  finally 블록은 생략 가능합니다.  finally 블록은 예외 발생 여부와 상관 없이 항상 실행됩니다. 심지어 앞에서 return문을 사용하더라도 실행됩니다.

 

Class.forName() 메소드는 매개값으로 주어진 클래스가 존재하면 클래스 객체를 리턴하지만, 존재하지 않으면 ClassNotFoundException이라는 예외 객체를 발생시킵니다.

 

package sec06.exam06;

 

public class Hello {

    public static void main(String[] args) {

        try {

            Class Clazz = Class.forName("java.lang.String2");

        } catch(ClassNotFoundException e) {

             System.out.println("클래스가 존재하지 않습니다.");

       }

    }

}

 

이처럼 catch문 안에 예상되는 예외 클래스를 매개변수로 넣은 후 예외처리를 수행하면 됩니다. catch 블록을 여러개 작성하여 다양한 오류가 예상되는 경우에 대비할 수도 있습니다. 

 

Exception 클래스는 지금까지 나온 예외들의 상위 클래스입니다. 이러한 상위 예외 클래스는 catch 블록에서 하위 예외 클래스보다 아래에 있어야합니다. 그렇지 않으면 하위의 모든 예외가 Exception에 걸리게 되어 아래의 catch 블록이 실행될 수 없습니다.

 

3. 예외 떠넘기기

throws 키워드는 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 catch 구문에서 처리하도록 떠넘깁니다. 발생할 수 있는 예외의 종류별로 throws 구문 뒤에 나열하는 것이 일반적이지만, throws Exception만으로 모든 예외를 간단히 떠넘길 수도 있습니다. 

결과:

클래스가 존재하지 않습니다.

 

main 함수에서도 throws 문을 통해 최종적으로 예외 처리가 가능합니다. 

'java' 카테고리의 다른 글

스레드 제어  (0) 2021.01.29
java.lang 패키지  (0) 2021.01.28
java 익명 객체 - 중첩 클래스와 중첩 인터페이스  (0) 2021.01.26
java 중첩 클래스, 중첩 인터페이스  (0) 2021.01.26
java 인터페이스(interface)  (0) 2021.01.25