본문 바로가기

04번. IT 힌트얻기/▶ 자바

[Java] Exception (1/2)

예외처리(Exception Handling)

1. 개요

자바에서 에러는 크게 두 종류로 나뉘어진다. 
컴파일할 때 발생하는 컴파일 타임 에러(Compile-Time Error)와 프로그램이 실행되는 동안 발생하는 실행 타임 에러(Run-Time Error)가 그것이다. 컴파일 타임의 에러는 자바의 문법적인 에러이기 때문에 아주 쉽게 처리할 수있다. 하지만 실행 타임의 에러는 이것과는 차원이 다르다. 실행 타임의 에러는 디버깅의 절차를 거치지 않으면 거의 잡을 수 없는 심각한 버그가 많다. 그리고 실행 타임의 잘못된 에러는 프로그램 자체를 멈추게 하는 원인이 될 수도 있다. 

 

2. 에러 이벤트(Error Event)

일반적으로 많이 발생하는 에러
# NullPointerException 
- 메모리가 없는 객체를 사용했을 때 발생하는 에러
# symbol 에러
- 메서드나 클래스의 이름이 잘못되었을 때 발생하는 에러
# try catch 에러
-try catch가 필요한데 붙이지 않았기 때문에 발생하는 에러 
-- 컴파일할 때 발생하는 에러를 자세히 보면 70~80%가 위의 세가지에 포함된다.

자바에서는 에러가 발생했을 때 에러 이벤트(Error Event)라는 것이 발생한다. 이 이벤트를 Exception이라고 한다. 프로그램에서 에러가 발생할 때 Exception 이벤트가 발생하고, 발생된 이벤트는 프로그래머가 처리하지 않으면 곧장 가상머신으로 넘어가게 된다. 가상머신에서는 이 이벤트를 받았을 때 에러 이벤트의 성격에 따라서 적절한 조치를 취하게 된다. 대부분의 경우 프로그램을 중지시키는 루틴을 실행하게 된다.
그렇다면 Exception 이벤트가 가상머신에 의해서 자동으로 처리되기 전에 에러를 처리하려 할 것이다. 실행 타임에 에러 이벤트가 발생했을 때 프로그래머가 먼저 이를 감지하기 위한 도구가 바로 try 와 catch다. 

 

3. 예외 처리

예외처리방법1 : 프로그램적으로 에러가 발생하지 않도록 완벽하게 코딩
예외처리방법2 : try와 catch를 이용해서 프로그래머가 에러를 감지해서 처리

프로그램 실행 시에 파일이 존재하지 않는다면 그리고 파일 존재 여부를 확인하는 루틴이 없다면 FileNotFoundException은 곧장  가상머신으로 보내질 것이다. 이 중간에 프로그래머가 FileNotFoundException을 가로채기 위해서 우선 try로 에러 감지 부분을 설정하고, 이 부분에서 에러가 감지되면 catch로 보낼 것이다.

고전적인 방식은 try, catch 보다는 프로그래머가 직접 처리하는 것을 선호하였다.
하지만 자바에서는 try와 catch를 필요한 곳에 의무적으로 사용하도록 하고 있다. 

 

4. 에러 처리의 예

입출력 작업을 할 때 에러처리를 붙여야 하는 곳
- 네트워크 입출력
- 데이터베이스 입출력
- 파일 입출력
- 메모리 입출력 

에러처리 루틴의 의무화
- 에러가 자주 발생하는 곳에는 컴파일러 차원에서 에러처리 루틴을 요구하기 때문에 의무적으로 에러처리 루틴을 요구하기 때문에 의무적으로 에러처리 루틴을 넣어야 한다.

에러처리 구문을 사용하는 이유
- 실행 타임의 에러를 미연에 방지하기 위하여
- 에러 이벤트가 발생했을 때 발생한 위치의 확인을 위하여
- 에러 이벤트가 발생했을 때 적절하게 대처하기 위해

<Example>

Case1> 예외처리 하지 않았을 경우 가상머신에서 에러 발생




Case2> 에러처리를 하였을 경우




 

 

5. try-catch-finally

<Exception Handler>

try{
          // 에러를 발생할 가능성이 있는 코드
}catch(에러이벤트1 변수){
         // 에러이벤트1이 발생했을 때 이벤트가 catch로 넘어오게 된다.
}catch(에러이벤트2 변수){
        // 에러이벤트2가 발생했을 때 이벤트가 catch로 넘어오게 된다.
}finally{
        //최종적으로 무조건적으로 처리해야 하는 작업

 
고의로 에러 발생시키기

String s = null
System.out.println(s.length());
//메모리가 없는 상태에서 점 찍고 사용하면 NullPointException이 발생한다. 


메모리가 없는 객체에 점을 찍는다면 참조할 메모리가 없다는 NullPointException이 발생한다. s.length()라는 문장이 실행되면 자동으로 에러 이벤트가 발생하게 되고, catch 블록에서 NullPointException 이벤트를 검색하게 된다.만약 catch 블록이 있다면, 해당 catch 블록이 호출된다. catch블록이 호출될 때 try에서 발생한 에러 이벤트는 매개변수로 들어가게 된다.

Try catch의 원리
- try 구문 내에서 에러가 발생하면 에러 이벤트가 생성된다. 이 에러 이벤트를 매개변수로 해서 catch 메서드를 호출하는 방식이다.
- catch 메서드는 내부에서 에러가 발생했을 때 자동으로 호출된다.

 

6. try-catch-finally의 예

1) 에러처리를 하지 않았을 경우
 



2) try-catch 처리



3) try-catch-finally 처리