728x90
반응형

예외 (exceptional event)

- 잘못된 코드, 부정확한 데이터, 예외적인 상황에 의해 발생하는 오류

- 예) 0으로 나누는 것과 같은 잘못된 연산이나 배열의 인덱스가 한계를 넘을 수도 있고, 디스크에서는 하드웨어 에러가 발생할 수 있다.

- 대부분의 경우, 예외가 발생하면 프로그램이 종료된다. 그러나 무조건 종료하는 것보다 프로그램에서 사전에 오류를 처리하도록 한 후에 실행한다면 더 나은 프로그램이 될 수 있다. 이것을 예외처리라고 한다.


프로그램 오류

- 컴파일 에러 : 컴파일할 때 발생하는 에러

- 런타임 에러 : 실행할 때 발생하는 에러

JAVA의 런타임 에러 - 에러(error)와 예외(exception)


에러는 어쩔 수 없지만, 예외는 처리해야 한다.

 에러(error) -> 프로그램 코드에 의해서 수습될 수 없는 심각한 오류

 예외(exception) -> 프로그램 코드에 의해서 수습될 수 있는 미약한 오류


예외처리의 정의와 목적

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

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

 

<강제 예외>

 고의적으로 0으로 나누어서 강제적으로 예외를 발생시킨다.



예외 처리기

 try 블럭은 예외가 발생할 수 있는 위험한 코드이고, catch블럭은 예외를 처리하는 코드이다.


예외 처리기의 기본 형식

 try {

      // 예외가 발생할 수 있는 코드

  } catch (예외종류 참조변수) { 

       // 예외를 처리하는 코드

  }

  finally {

       // 여기 있는 코드 try 블록이 끝나면 무조건 실행된다. 생략이 가능하다.

  }


<예외처리 1>

 0으로 나누는 예외를 발생시켜 예외처리한다.





<예외처리 2>

 배열의 크기를 벗어나는 경우에 발생되는 예외를 처리한다.




<예외처리 3>

 예외가 발생하지 않은 경우 (Exception : 정확한 예외의 이름은 모를 경우에 사용)




​<예외처리 4>

- try블럭에서 예외가 발생하면, 발생한 예외를 처리할 catch블럭을 찾는다. 첫번째 catch블럭부터 순서대로 찾고, 일치하는 catch블럭이 없으면 예외는 처리되지 않는다.

- 예외의 최고 조상인 Exception을 처리하는 catch블럭은 모든 종류의 예외를 처리할 수 있다. (반드시 마지막 catch블럭이어야 한다.)




finally 블럭

- 오류 발생과 상관없이 항상 실행되어야 하는 코드는 finally 블럭에 넣는다.

- 선택적으로 사용할 수 있으며, try-catch-finally의 순서로 구성된다.

- 예외가 발생한 경우 : try -> catch -> finally의 순서로 실행

- 예외가 발생 안한 경우 : try -> finally의 순서로 실행

- try 또는 catch블럭에서 return문을 만나도 finally블럭은 수행된다.




<finally 블럭 1>

  예외가 발생한 경우




<finally블럭 2>

 예외가 발생 안한 경우




예외의 종류

 Error : 자바 가상 기계 안에서 치명적인 오류가 발생

 RuntimeException : 프로그래밍 버그나 논리 오류에서 발생한다.




 <예외를 처리하는 방법>

① 예외를 잡아서 그 자리에서 처리하는 방법 : 해당 메서드 안에서 try - catch 블럭을 사용하여 예외를 잡고 처리한다.

② 메소드가 예외를 발생시킨다고 기술하는 방법 : 메서드가 발생되는 예외를 바로 처리하지 않고, 자신을 호출한 상위 메서드로 예외를 전달하는 방법. throws를 사용하여 다른 메서드한테 예외 처리를 맡긴다.


예외 생성하기

- 예외는 throw 문장을 이용하여 생성한다.

- new 키워드로 생성하고, throw키워드로 발생시킨다.

1.먼저, 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음

     Exception e = new Exception("고의로 발생시켰음");

2.키워드 throw를 이용해서 예외를 발생시킨다.

      throw e;        throw new Exception("고의로 발생시켰음");


<예외 생성 1>

 Exception 인스턴스를 생성할 때, 생성자에 문자열을 넣어주면 Exception 인스턴스에 메시지로 저장된다. 이 메시지는 getMessage()와 printStackTrace()를 사용하여 출력할 수 있다.




<예외 생성 2>

 참조변수 ae를 통해 생성된 ArithmeticException인스턴스에 접근할 수 있다.




예외 클래스의 계층구조

- 예외 클래스는 크게 두 그룹으로 나뉜다.

  RuntimeException클래스들 -> 프로그래머의 실수로 발생하는 예외 <-예외처리 선택

  Exception클래스들 -> 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외 <- 예외처리 필수


- RuntimeException 클래스들 : 배열의 범위 벗어나는 것, 값이 null인 참조변수의 멤버를 호출하는 것, 클래스간의 형변환을 잘못한 것, 정수를 0으로 나누려고 하는것 등

- Exception 클래스들 : 존재하지 않는 파일의 이름을 입력한 것, 실수로 클래스의 이름을 잘못 입력한 것, 데이터 형식이 잘못된 것 등



<예외 클래스 1>

 컴파일 단계에서 발생하는 오류




<예외 클래스 2>

 try ~ catch문으로 예외처리를 해주어야 컴파일이 성공적으로 된다.




<예외 클래스 3>

 예외처리를 하지 않았지만 컴파일은 성공적으로 된다. 하지만 파일을 실행하면 아래와 같이 RuntimeException이 발생하여 비정상적으로 종료된다. RuntimeException 클래스들은 예외처리를 해주지 않아도 컴파일러가 문제삼지 않는다.



728x90
반응형

+ Recent posts