예외처리 (Exception )

2020. 3. 17. 11:18자바 Java/자바 공부 java study

반응형

 

 Error(에러)와 Exception(예외의 차이) 

예외 -> 컴파일 때 아니라 런타임 때 발생한다.  프로그램 실행 중 어떤 이유로 프로그램이 종료됨.

예외처리 -> 프로그램이 종료되는상황 (런타임 에러) 이 왔을때 어떻게 대응 할 것인지에 대한 명세를 작성 해주는 것.

 

에러(Error)란 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램에 이상이 생겼거나 JVM 실행에 문제가 생겼을 경우 발생하는것을 말한다. 이 경우 개발자가 대처할 방법은 극히 제한적이다. 하지만 예외(Exception)은 다르다. 예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 말한다. 예외가 발생하면 프로그램이 종료가 된다는것은 에러와 동일하지만 예외는 예외처리(Exception Handling)을 통해 프로그램을 종료 되지 않고 정상적으로 작동되게 만들어줄 수 있다. 자바에서 예외처리는 Try Catch문을 통해 해줄 수 있다.

 

<예외의 종류>  

RuntimeException : 우리가 잘못 한 거 ( 잘못 안할 수도 있엇음 ) 부정확한 코드에 의해서 발생

-> 얼마든지 조건 검사로 회피 가능한 친구들. 

 

*** IOException (input , output ) : 우리 프로그램 메모리 영역 밖의 누군가와 데이터를 주고받을때 발생할 수 있는 예외 

->> 필수적으로 예외처리를 적용해야 하는 부분  

 

체크 예외는 컴파일러가 예외처리를 강요/ 비체크 예외는 컴파일러가 신경 안쓰는 예외 

 

--------------------------------------------------------------------------------------------------------------------------

여러가지 예외들 

예외구문  이유 
ArithmeticException 정수를 0으로 나눌 경우 발생 
ArrayIndexOutOfBoundsException 배열의 범위를 벗어난 index 를 접근 할 시 발생 
ClassCastExcetion 변환할 수 없는 타입으로 객체를 반환 시 발생
NullPointException  존재하지 않는 레퍼런스를 참조할때 발생 
IllegalArgumentException 잘못된 인자를 전달 할 때 발생 
IOException 입출력 동작 실패 또는 인터럽트 시 발생 
OutOfMemoryException  메모리가 부족한 경우 발생  
NumberFormatException  자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환시 발생 

 

 

※빈도 수가 높은 예외 

 

NullPointException

자바 프로그램에서 가장 빈번하게 발생하는 에러이다. 이 에러는 객체 참조가 없는 상태, 즉 null 값을 갖는 참조변수로 객체 접근 연사자인 토드(.)를 사용했을 때 발생한다. (null  값을 참조 하려고 하면 나오는 예외이다) 객체가 없는 상태에서 객체를 사용하려 했으니 예외가 발생하는 것이다.

-> if(pointer!=null)  이런식으로 회피 가능 

 

ArrayIndexOutOfBoundsExcetion

배열에서 인덱스 범위를 초과하여 사용할 경우 발생한다. 예를 들어 길이가 3인 int[]arr = new int[3] 배열을 선언했다면 0 ~ 2까지의 index만 사용할 수 있다. 하지만 이 배열의 index가 -1 이나 3을 참조하는 순간 예외가 발생한다.

-> if(arr.length<index) 이런식으로 범위 밖으로 벗어나는거 회피 가능 

 

NumberFormatException 

개발을 하다보면 문자열로 되어있는 데이터를 숫자타입으로 변경하는 경우가 자주발생한다. 대표적으로 Integer.parseInt(String n)으로 치환한다. 하지만 숫자타입으로 변경할 수 없는 문자를 치환시키려고 하면 발생하는 에러이다.

 

ClassCastExcetion

타입 변환은 상위 클래스와 하위클래스간에 발생하고 구현 클래스와 인터페이스간에도 발생한다. 이런 관계가 아니면 클래스는 다른 클래스로 타입을 변환할 수 없다. 하지만 이 규칙을 무시하고 억지로 타입을 변환시킬경우 발생하는 에러이다.

-> instanceof 사용해서 회피 가능 

 

 

 

 

 

 

 

e.getMessage()  e.toString()  e.printStackTrace() 의 차이점 

public class ExeThrowException {
   public static void main (String args[]){
      try{
         //메시지와 함께 수동으로 에러 이벤트 발생
         throw new Exception("에러내용입니다.");
      }catch(Exception e){
         System.out.println("e.getMessage() = " + e.getMessage());
         System.out.println("e.toString() = " + e.toString());
         //System.out.println("e.printStackTrace() = " e.printStackTrace());
         e.printStackTrace();
         return;
      }
   }
}

 

 

 

** 결과
e.getMessage() = 에러내용입니다.
e.toString() = java.lang.Exception: 에러내용입니다.
e.printStackTrace() = java.lang.Exception: 에러내용입니다.
              at ExeThrowException.main(ExeThrowException.java:5)


** 기능
e.getMessage() : 에러 이벤트와 함께 들어오는 메세지 출력
e.toString() : 에러 이벤트의 toString()을 호출해서 간단한 에러 메시지 확인
e.printStackTrace() : 에러 메세지의 발생 근원지를 찾아 단계별로 에러 출력

 

 

 

 

 

사용자 정의 예외 

: exception 클래스의 서브 클래스를 생성시켜서 만든다. 

 

 

 

https://programmingyoon.tistory.com/27

반응형