IT 개발노트

예외처리 본문

기초튼튼/JAVA

예외처리

limsungju 2019. 1. 30. 11:35

1. 예외처리
1.1 Error(에러)와 Exception(예외의 차이)

: 에러란 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램에 이상이 생겼거나 JVM 실행에 문제가 생겼을 경우 발생하는 것을 말한다.
이 경우 개발자는 대처할 방법이 극히 제한적이다. 하지만 예외는 다르다.
예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 말한다.
예외가 발생하면 프로그램이 종료가 된다는것은 에러와 동일하지만 예외는 예외처리를 통해 프로그램을 종료되지 않고 정상적으로 작동되게 만들어 줄 수 있다. 자바에서 예외처리는 Try Catch문을 통해 해줄 수 있다.
- 에러 : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
- 예외 : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

1.2 예외 클래스의 계층구조


: 자바에서는 실행할 수 있는 오류를 각각 Exception, Error 클래스로 정의하였고 Object 클래스의 자손들이다.

1.2.1 예외의 최고 조상 Exception class


: RentimeException과 그 자손클래스들은 RuntimeException클래스들이라하고 나머지들은 Exception클래스라고 한다.
- RuntimeException클래스들 : 프로그래머의 실수로 발생하는 예외
- Exception클래스들 : 사용자의 실수 같은 외적인 요인에 의해 발생하는 예외

1.2.2 여러가지 예외들

 예외 구문

이유 

ArithmeticException

정수를 0으로 나눌경우 발생 

ArrayIndexOutOfBoundsException

배열의 범위를 벗어난 index를 접근 할 시 발생 

ClassCastException 

변환할 수 없는 타입으로 객체를 반환 시 발생

NullPointException 

존재하지 않는 레퍼런스를 참조할때 발생 

IllegalArgumentException

잘못된 인자를 전달 할 때 발생

IOException 

입출력 동작 실패 또는 인터럽트 시 발생 

OutOfMemoryException 

메모리가 부족한 경우 발생 

NumberFormatException 

문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환시 발생


1.2.3 빈도수가 높은 예외
- NullPointException

: 자바 프로그램에서 가장 빈번하게 발생하는 에러이다. 이 에러는 객체 참조가 없는 상태, 즉 null값을 갖는 참조변수로 객체 접근 연산자인 토드(.)를 사용했을 때 발생한다. 객체가 없는 상태에서 객체를 사용하려 했으니 예외가 발생하는 것이다.

- ArrayIndexOutOfBoundsException
: 배열에서 인덱스 범위를 초과하여 사용할 경우 발생한다. 예를들어 길이가 3인 int[]arr = new int[3] 배열을 선언했다면 0~2까지의 index만 사용할 수 있다 하지만 이 배열의 index가 -1이나 3을 참조하는 순간 예외가 발생한다.

- NumberFormatException
: 개발을 하다보면 문자열로 되어있는 데이터를 숫자타입으로 변경하는 경우가 자주 발생한다. 대표적으로 Integer.parseInt(String n)으로 치환한다. 하지만 숫자타입으로 변경할 수 없는 문자를 치환시키려고 하면 발생하는 에러이다.

- ClassCastException
: 타입 변환은 상위 클래스와 하위클래스간에 발생하고 구현 클래스와 인터페이스간에도 발생한다. 이런 관계가 아니면 클래스는 다른 클래스로 타입을 변환할 수 없다. 하지만 이 규칙을 무시하고 억지로 타입을 변환시킬 경우 발생하는 에러이다.

1.3 예외처리하기 try-catch문
예외처리의 정의 : 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코                         드를 작성하는 것
예외처리의 목적 : 프로그램의 비정상 종료를 막고 정상적인 실험상태를 유지                         하는 것
특징
- if else와 달리 try-catch는 블럭내에 포함된 문장이 하나여도 { }를 생략할 수    없다.
- try블럭 다음에는 여러 종류의 예외를 처리할 수 있도록 여러개의 catch블럭    을 사용할 수 있다.

예시 1

1
2
3
4
5
6
7
8
9
10
try{
    //에러가 발생할 수 있는 코드
    throw new Exception(); //강제 에러 출력 
}catch (Exception e){
    //에러시 수행
     e.printStackTrace(); //오류 출력(방법은 여러가지)
     throw e; //최상위 클래스가 아니라면 무조건 던져주자
}finally{
    //무조건 수행
}


: try블록에는 예외가 발생할 수 있는 코드가 위치한다. try블록의 코드가 예외없이 정상 실행되면 catch블록의 코드는 실행되지 않고 finally블록의 코드를 실행한다. 하지만 try블록의 코드에서 예외가 발생하면 즉시 실행을 멈추고 catch블록으로 이동하여 예외처리 코드를 실행한다. 그리고 finally블록의 코드를 실행한다. (finally블록은 생략 가능하다.)
try-catch문을 주로 쓰는 구간은 주로 데이터베이스에 데이터를 주고 받을 경우 많이 사용한다. 데이터베이스를 거쳐올때는 변수가 많이 생기기 때문에 try-catch문은 필수이다. 그리고 finally에는 데이터베이스와의 연결을 끊어주는 코드를 주로 삽입한다. 특정 예외가 발생하여 데이터베이스와의 연결이 끊어지지 않으면 여러가지 문제가 발생할 수 있기 때문이다.

1.4 예외의 발생과 catch블럭
- catch블럭은 괄호( )와 블럭 { } 두 부분으로 나눠져 있는데 괄호 ( )내에는 처    리하고자 하는 예외와 같은 타입의 참조변수 하나를 선언해야 한다.
- 예외가 발생하면 해당 클래스의 인스턴스가 만들어진다.
- 예외가 발생한 문장이 try-catch문의 try블럭에 있다면, 이 예외를 처리할 수    있는 catch블럭을 찾게된다.
- 첫번째 catch블럭부터 차례로 내려가면서 catch블럭의 괄호( )내에 선언된      참조변수의 종류와 생성된 예외클래스의 instance에 instanceof를 사용해 검    사하고 결과가 true이면 예외처리한다. 모든 예외 클래스는 Exception클래스    의 자손이므로 Exception클래스 타입의 참조변수를 선언해 놓으면 어떤 종      류의 예외가 발생해도 이 catch블럭에 의해 처리된다.

예시 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package sungju.Java.ExceptionEx;
 
public class ExceptionEx {
    public static void main(String[] args) {
         System.out.println(1);
         System.out.println(2);
 
         try {
             System.out.println(3);
             System.out.println(0/0); // 0으로 나눠서 고의로 ArithmeticException을 발생시킨다.
             System.out.println(4);  // 실행되지 않는다
         }catch (Exception e){
             System.out.println(5);
         }
         System.out.println(6);
    }
}


: 예외가 발생했을 때 생성되는 예외클래스의 인스턴스에는 발생한 예외에 대한 정보가 담겨져 있으며 다음 method들을 통해 정보를 얻을 수 있다.
- printStactTrace( ) : 예외발생 당시의 호출스택에 있었던 메서드의 정보와                                예외 메시지를 화면에 출력
- getMessage( ) : 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수                          있다.

예시 3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package sungju.Java.ExceptionEx;
 
public class ExceptionEx {
    public static void main(String[] args) {
        System.out.println(1);
        System.out.println(2);
        try {
            System.out.println(3);
            System.out.println(0/0); // 예외발생 !!
            System.out.println(4);  // 실행되지 않는다
        }catch (ArithmeticException ae){
            ae.printStackTrace(); // 참조변수 ae를 통해, 생성된 ArithmeticException 인스턴스에 접근할 수 있다.
            System.out.println("예외메세지 : " + ae.getMessage());
        }
        System.out.println(6);
    }
}


1.5 예외 발생시키기
: 키워드 throw를 사용해서 프로그래머가 고의로 예외를 발생시킬 수 있다.
- 먼저 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든다.
- 키워드 throw를 이용해서 예외 발생

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package sungju.Java.ExceptionEx;
 
public class ExceptionEx {
    public static void main(String[] args) {
        try {
              Exception e = new Exception("고의로 발생시킴");
              throw e; // 예외를 발생시킴
              // throw new Exception("고의로 발생시킴"); --> 위에 두줄을 한줄로 표현
 
          }catch (Exception e){
              System.out.println("예외메세지 : " + e.getMessage());
              e.printStackTrace();
          }
          System.out.println("프로그램이 정상 종료되었음." );
      }
    }



1.6 예외는 반드시 throw해주기
: 최상위 클래스를 제외한 나머지 클래스에서의 예외처리는 반드시 Throw를 해주어야 한다. 그렇지 않으면 예외처리를 해주었음에도 불구하고 Main에서는 Exception을 전달받지 못하여 재발자가 예외를 인지못하는 경우가 생긴다.


'기초튼튼 > JAVA' 카테고리의 다른 글

JAVA 입출력(I/O) 알아보기  (0) 2019.02.10
컬렉션이란  (0) 2019.02.07
내부 클래스란?  (0) 2019.01.29
인터페이스란?  (0) 2019.01.28
추상클래스란?  (0) 2019.01.27