* 프로그램 오류
: 프로그램이 실행 중 어떤 원인에 의해 오작동을 하거나 비정상적으로 종료되는 경우가 있다. 이렇나 결과를 초래하는 원인을 프로그램 에러 또는 오류라고 한다.
이를 발생시점에 따라 '컴파일 에러(compile-time error)'와 '런타임 에러(runtime error)'로 나눌 수 있는데, 글자 그대로 '컴파일 에러'는 컴파일 할 때 발생하는 에러이고 프로그램의 실행 도중에 발생하는 에러를 '런타임 에러'라고 한다.
자바에서는 실행 시(runtime) 발생할 수 있는 프로그램 오류를 '에러(error)'와 '예외(exception)', 두 가지로 구분하였다.
에러는 메모리 부족(OutOfMemoryError)이나 스택오버플로우(StackOverflowError)와 같이 일단 발생하면 복구할 수 없는 심각한 오류이고, 예외는 발생하더라도 수습될 수 있는 비교적 덜 심각한 것이다.
에러가 발생하면, 프로그램의 비정상적인 종료를 막을 길이 없지만, 예외는 발생하더라도 프로그래머가 이에 대한 적절한 코드를 미리 작성해 놓음으로써 프로그램의 비정상적인 종료를 막을 수 있다.
- 에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
- 예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
* 예외처리의 정의와 목적
: 예외처리(exception handling)란, 프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것이며, 예외처리의 목적은 예외의 발생으로 인한 실행 중인 프로그램의 갑작스런 비정상 종료를 막고, 정상적인 실행상태를 유지할 수 있도록 하는 것이다.
* 예외처리 구문(try - catch)
: 하나의 try 블럭 다음에는 여러 종류의 예외를 처리할 수 있도록 하나 이상의 catch 블럭이 올 수 있으며, 이 중 발생한 예외의 종류와 일치하는 단 한 개의 catch 블럭만 수행한다.
발생한 예외의 종류와 일치하는 catch블럭이 없으면 예외는 처리되지 않는다.
[참고] if문과 달리 try 블럭이나 catch 블럭 내에 포함된 문장이 하나라고 해서 괄호{}를 생략할 수는 없다.
* try - catch 문에서의 흐름
: try - catch문에서, 예외가 발생한 경우와 발생하지 않았을 때의 흐름(문장의 실행순서)가 달라지는데, 아래의 이 두가지 경우에 따른 실행 순서를 정리하였다.
- try블럭 내에서 예외가 발생한 경우:
1. 발생한 예외와 일치하는 catch블럭이 있는지 확인한다.
2. 일치하는 catch 블럭을 찾게 되면, 그 catch 블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다. 만일 일치하는 catch블럭을 찾지 못하면, 예외는 처리되지 못한다.
- try블럭 내에서 예외가 발생하지 않은 경우:
1. catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속한다.
* 예외 발생시키기
: 키워드 throw를 사용해서 프로그래머가 고의로 예외를 발생시킬 수 있으며, 방법은 아래의 순서를 따르면 된다.
1. 먼저, 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음
Exception e = new Exception("고의로 발생시켰음");
2. 키워드 throw를 이용해서 예외를 발생시킨다.
throw e;
Exception인스턴스를 생성할 때, 생성자에 String을 넣어 주면, 이 String이 Exception 인스턴스에 메시지로 저장된다. 이 메시지는 getMessage()를 이용해서 얻을 수 있다.
* 예외 클래스의 계층 구조
Object
Throwable
Exception
IOException
...
RuntimeException
Error
...
OutOfMemoryError
[참고] 위의 그림은 전체의 Exception 클래스 중에서 몇 개의 주요 클래스들만을 나열한 것이다.
* 예외의 발생과 catch 블럭
: catch 블럭은 괄호()와 블럭{} 두 부분으로 나눠져 있는데, 괄호() 내에는 처리하고자 하는 예외와 같은 타입의 참조변수 하나를 선언해야 한다.
예외가 발생하면 발생한 예외에 해당하는 클래스의 인스턴스가 만들어 진다.
- printStackTrace() : 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
- getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
* finally 블럭
: finally 블럭은 try-catch문과 함께 예외의 발생여부에 상관없이 실행되어야 할 코드를 포함시킬 목적으로 사용된다. try-catch문의 끝에 선택적으로 덧붙여 사용할 수 있으며, try-catch-finally 의 순서로 구성된다.
'개발 관련 지식 > 자바(Java)' 카테고리의 다른 글
[자바] URL 호출 방법 (0) | 2015.01.29 |
---|---|
[자바] String(문자열) 함수 정리 (0) | 2014.10.22 |
[자바] 인터페이스(interface) (0) | 2014.07.03 |
[자바] 추상 클래스(abstract class) (0) | 2014.07.02 |
[자바] 상속(inheritance) (0) | 2014.07.02 |