Java - 예외 처리 (Exception)

Programming/Java 2015. 12. 8. 02:41

프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료될 수 있다. 이러한 것을 우리는 에러났다, 오류가 발생했다가로 말한다.

에러는 두 가지가 있다.

'컴파일 에러'는 컴파일 할 때 발생하는 에러이고, '런타임 에러'는 프로그램 실행 도중에 발생하는 에러를 말한다.

 

우리가 소스 코드를 짠다고 가정하자. 그것은 .java파일을 만드는 과정이다.(인간들이 알아들을 수 있는 언어)

우리는 .java파일을 만들고 그 파일을 컴파일러에게 컴파일 요청을 한다. 그럼  이 컴파일러는 우리가 작성한 .java파일의 오류, 잘못된 구문, 자료형 체크 등 기본적인 문법 검사를 수행하여 오류가 있는지 알려준다. 성공적으로 각종 오류 검사를 마치고 나서 클래스 파일인 .class파일이 생성되고 클래스 파일을 실행할 수 있는 것이다.

하.지.만 컴파일을 에러없이 성공적으로 마쳤다고 해도 프로그램이 실행 도중 발생하는 에러는 있을 수 있다.  (이것이 런타임 에러)

우리는 런타임 에러를 일상생활에서 쉽게 마주친다. 예를 들어 어떤 프로그램을 실행시키는데 작동이 되지 않는경우, 혹은 갑자기 멈춘경우 등이다.

그래서 이런 오류 혹은 에러들을 모두 고려해서 프로그램을 작성해야 한다.

 

자바에서는 실행 도중 발생할 수 있는 프로그램 오류를 에러와 예외로 나누었는데 에러는 메모리 부족이나 스택오버플로우같이 발생할 경우 복구할 수 없는 심각한 것이고, 예외는 발생하더라도 수습될 수 있는 비교적 에러보다는 덜 심각한 것이다.

 

그렇다면 우리는 우리 손에서 처리할 수 있는? 예외처리에 대해서 공부해보자.

예외를 처리하는데 있어서 구문이 있다.

try {

// 예외가 발생할 가능성이 있는 내용, 메소드 등...

} catch (Exception e) {

// 예외가 발생했을때 수행하는 내용

}

다음과 같이 try~catch구문을 사용해서 우리는 예외 처리를 할 것이다.

 

<실습 - 1>



-결과-


왜 이런 구문이 뜬것인가? 코드를 보면 100이라는 숫자를 Math.random()으로부터 나온 숫자로 나누는 작업을 10번한다.

Math.random() 메소드는 0~9사이 무작위로 숫자 아무거나 반환하는데 나누기로 0을 반환해 버려서 에러가 나는 것이다.

자바에서는 정수를 0으로 나누면 위에 보시다시피 ArithmeticException을 발생시킨다.

자 그렇다면 예외가 어떻게 발생했는지 알수 있게 되었으니 try~catch 구문을 이용해 예외처리를 해보자.

 

<실습 - 2>


-결과-



위 코드를 보면 정수로 0을 나누어서 발생하는 ArithmeticException 예외에 대해서 try~catch문을 사용했다.

ArithmeticException가 발생했을 때 System.out.println("0으로 나누는 것은 불가능합니다."); 의 문장을 수행하게 된다.

그래서 결과에도 0아 아닌 다른 숫자들로 나누었을때는 정상적으로 프로그램이 작동하다가 0으로 나누는 순간 예외가 발생하여 catch문 안에 문장을 수행한 것이다.

 


<try-catch 흐름>

이번에는 예외가 발생했을때 try-catch문이 어떤 순서로 동작하는지 알아보자.

1. 예외가 발생하지 않은 경우

발생한 예외와 일치하는 catch블럭이 있는지 확인 한 후, 있으면 그 catch블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속 수행한다. 일치하는 catch문을 못찾을 경우 예외는 처리되지 못하고 try-catch문을 빠져나와 문장을 수행한다.


<실습>



-결과-





2. try-catch에서 예외가 발생한 경우

catch블럭을 거치지 않고 try-catch문을 빠져나가서 계속 문장을 수행한다.



-결과-





<실습 - 3>

NumberFormatException을 발생시켜 숫자가 아닌 다른 문자를 받게 되면 예외처리하는 놈이다. 알아보도록 하자.



-결과-





<메서드에 예외 선언>

메서드에 예외를 선언하려면 throws라는 키워드와 함께 이 메소드를 사용하게 되면 발생할 수 있는 예외들을 옆에 나열할 수 있다.

이렇게 나열하게 되면 다음에 이 메소드를 사용하려는 사용자가 예외처리된 구문을 보고 어떠한 예외들이 처리되어야 하는지 알 수 있게 된다.



-결과-



'Programming > Java' 카테고리의 다른 글

Java - InputStream, OutputStream  (0) 2015.12.08
Java - Thread, (run()메소드, start()메소드의 차이)  (0) 2015.12.08
Java - Hashtable, HashMap  (0) 2015.12.08
Java - Iterator  (0) 2015.12.08
Java - Vector클래스  (0) 2015.12.08
posted by 경원구