본문 바로가기

개발/Java

[JAVA 기초] 예외처리

반응형

01) 예외발생의 예

● 연산처리 과정

▷정수를 0으로 나누면 불능으로 인한 오류 발생

▷할당된 범위 밖의 배열요소를 처리하고자 할 때

● 파일처리 과정

▷사용하고자 하는 파일을 찾지 못하는 경우

▷읽고 있는 파일의 끝을 만났을 때

● 통신처리 과정

▷통신을 통해 연결할 때 주소가 잘 못 지정된 경우

▷통신 중 상대측에서 연결을 끊는 경우

● 기타 특별한 상황의 발생에 대한 통보

▷특정한 조건의 도래에 따른 인터럽트의 발생

 

<예외가 발생에 대한 조치>

- 연산처리 과정에서 발생하는 오류

->프로그램이나 데이터의 보완을 요구하는 예외상황이 된다.

- 파일처리 과정에서 발생하는 오류

-> 파일이 찾을 수 없음을 알려 주어 파일의 명칭을 수정하는 절차가 수행되도록 하여야 한다.

- 통신처리 과정에서 발생하는 오류

->발생된 예외를 감지한 다른 쪽에서도 이에 대한 처리를 준비하는 것이 필요하다.

 

02) 예외와 조치방법

● 예외의 정의

▷프로그램에서 발생하는 예기치 않은 상황

▷프로그램에서 일부러 도래하길 기다리는 상황

● 예외 발생시 조치방법

▷예외의 원인이 된 프로그램이나 데이터의 보완

▷예외상황의 발생에 대한 통보 : 프로그래밍으로 처리

▷예외상황에 대한 자동적인 조치 : 프로그래밍으로 처리

 

 

 03) 예외의 발생 - 연산 오류

● 프로그램 - 연산오류 발생

class Exception1{

   public static void main(String args[]){

   int i = 5; int j = 0;

   int k = i/j;      //불능 : 예외상황의 발생

   System.out.println("k = "+ k);

}

}

 

● 오류 메시지

Java.lang.ArithmeticException : / by zero

At Exception1.main<Exception1.java:4>

▷i의 값인 5를 j의 값인 0으로 나눌 때 오류 발생

▷예외 ArithmeticException이 발생

 

 

04) 예외의 발생 - 배열범위 초과

● 로그램 - 배열범위 초과오류 발생

Class Exception2 {

    public static void main(String args[]) {

    int i = 0;

    String array[]={"one", "two", "three"};  //배열요소는 3개

   

    while(i < 4) {          // i값 : 0 ~3 (4개)

System.out.println(array[i]);   //4번째(i = 3) 배열 : 오류

i++;

System.out.println("배열요소 증가 : i = " + i);

}

}

}

● 오류 메시지

Java.lang.ArrayIndexOutOfBoundsException : 3

At Exception2.main<Exception2.java:7>

▷생성된 배열의 크기를 초과한 배열요소의 인쇄 시도

▷예외 ArrayIndexOutOfBoundsException 통보

 

05) 예외 처리 문형

● 기본적인 예외 처리 구문

▷'try-catch-finally' 구문 이용

▷예외가 발생한 메소드 내에서 예외를 처리하는 방식

● 기본 문형

    try

블록 1

   catch(<예외클래스명> <변수명>)

블록 2                             // 복수의 catch 문을 사용할 수 있음

   finally

블록 3

 

 try 블록 : 이 블록은 오류의 발생이 예상되는 문장을 포함한다. 연산문장이 될 수도 있으며, 파일이나 통신을 처리하는 하나 또는 복수의 문장이 될 수도 있다.

 catch 블록 : 이 블록은 try 블록을 수행 중에 발생될 수 있는 예외를 처리하기 위한 블록이다. 만약, 여러 유형의 예외가 발생될 것으로 예상한다면 각각의 예외에 대해 별도의 catch 블록을 작성하여야 한다.

 finally 블록 : 이 블록은 예외의 발생과 무관하게 반드시 처리되어야 하는 문장을 포함하는 블록이다. 즉, try 블록 내의 처리를 하다가 예외가 발생하지 않으면 catch 블록을 거치지 않고 바로  finally 블록을 처리한다. 한편, 예외가 있는 경우는 해당 예외를 위한 catch 블록을 처리한 뒤에 finally 블록을 처리한다. 이 블록은 try catch 블록을 정의한 경우도 생략할 수 있는 선택적 블록이다.

 

06) 예외의 처리

​   class Exception3 {

public static void main(String args[]) {

int i = 0;

String array[] = {"one", "two", "three"};  //3개 배열

 

while(i<4) {       // 4개 배열(0 ~3)까지 인쇄

try {

      System.out.println(array[i]);  //4번째(i = 3) 배열 : 오류

} catch(ArrayIndexOutOfBoundsException e) {

   System.out.println("배열 범위 초과");   //배열오류시 수행

   break;

} finally {

  i++;

  System.out.println("배열요소 증가 : i = "+i);

}

       }

    }

}

 

07) 예외의 전파속성

● 예외의 처리가 정의되지 않으면

▷ 예외가 발생된 메소드의 호출 메소드로 전파됨

● 프로그램 - 예외의 전파

class Exception4

{

    public static void main(String args[]) {

 method1();

}

static void method1() {

  method2();             //(2) 오류 전파 : main()으로 전파

}

static void method2(){

    int i = 5; int j = 0;

    int k = i / j;     //(1) 오류 발생 : method1()으로 전파

    System.out.println("k = " + k);

}

}

● 오류 메시지

    Java.lang.ArithmeticException : / by zero

    At Exception4.method2 Exception4.java.11>

    At Exception4.method1 Exception4.java.7>

    At Exception4.main Exception4.java.4>

 

08) 예외의 전파순서와 처리방법

● 예외의 전파순서(default)

▷예외 발생

→ 해당 메소드 내에서 처리

▷해당 메소드에 처리가 정의되어 있지 않으면

→ 호출 메소드로 이전하여 처리

→ try-catch 문에 정의된 대로 처리

▷호출메소드에 예외의 처리가 정의되어 있지 않으면, 그 앞의 호출메소드로 전파

→ 최종 main()메소드까지 전파

→ 비정상적인 종료

● throws 문

▷예외 발생을 예측하고, 이 예외를 호출 메소드로 이전함을 명시

▷적절한 앞의 호출 메소드에서 try-catch를 이용한 처리방법 정의

 

09) 전파된 예외의 처리

● throws를 이용한 예외의 명시적인 전파

▷예외를 넘겨 특정한 메소드에게 처리를 의뢰할 때 사용

▷예외의 전파 및 처리상황을 명확히 파악 가능

● 프로그램 - 전파된 예외 처리 

      class Exception5 {

public static void main(String args[]) {

method1();

}

static void method1() {

     try {

method2();      //method2() 수행시의 연산오류는 여기서 처리

} catch (ArithmeticException e) {     //오류내역은 e에서 관리됨

e.printStackTrace();        //e에 들어 있는 오류내용을 출력함

}

       }

static void method2() throws ArithmeticException {    // throws : 호출 메소드로 예외를 전파

int i = 5; int j = 0;

int k = i/j;     // 오류발생

System.out.println("k = " +k);

}

}

 

10) 예외의 분류

Throwable

___________|_______________

|                                      |

Error                               Exception

● 모든 예외는 Throwable 클래스로부터 상속

▷ Error : 복구가 불가능한 치명적인 오류

▷ Exception : 프로그램의 수정이나 처리가 요구되는 오류나 상황

 

<두가지 유형의 차이점>

- Error : 시스템 차원의 치명적인 오류를 말하며, 가상기계에서의 메모리 초과나 스택크기 초과와 같은 오류, 그리고 컴파일 후 링크과정에서 발생하는 오류가 포함된다.

- Exception : 사용자의 프로그램으로 인해 발생되는 예외의 형태이다. 연산 오류, 배열초과 오류, 인터럽트 통보, 입출력 오류 등에 관련된 다양한 Exception 클래스들로 상속된다.

 

11) 예외 관련 클래스

 클래스

하위 클래스 

발생 상황 

 RuntimeException

 ArithemeticException

 불능 등에 의한 산술적 오류

 

 NullPointerException

주소가 null인 객체의 메소드나 변수에 접근 

 

 IndexOutOfBoundsException

배열이나 문자열의 범위를 초과 

 ClassNotFoundException

 

특정한 클래스를 찾지 못할 때 발생 

InterruptedException 

 

인터럽트의 발생(notify()의 호출 등의 이유로 발생) 

IOException 

FileNotFoundException 

접근하려는 파일을 발견하지 못함 

 

EOFException 

파일의 끝을 만남 

 

 

12) 예외의 인위적인 발생

● 응용 프로그램에 의한 예외의 발생

▷ 시스템에서는 예외의 상황을 만나면 미리 정의된 예외를 발생시킴

▷ 응용 프로그램에서도 필요한 경우에 예외를 발생시킬 수 있음

● 예외의 발생은 throw라는 키워드를 사용

▷ 예외클래스는 Exception 클래스를 상속함

▷ throw는 프로그램에서 정의하는 예외클래스로 예외를 발생시킴

● 프로그램 - 예외의 인위적 발생

    class Grade {

int grade;

void setGrade(int score) throws OutOfBounds     // 예외의 전파

{

   if(score > 100 || score < 0)         // 점수 범위 오류

throw new OutOfBoundScore(score);                   // 예외의 생성 및 발생

   else { grade = score / 10; }         // 정상값

}

        }

    class OutOfBounds extends Exception     //예외클래스의 정의

    {

OutOfBounds(int score) {

   super("OutOfBounds Exception : " + score); // super = Exception

}

반응형