exception

David8·2022년 6월 11일
0

java

목록 보기
4/7

try catch

  1. 개념

    1. error vs exception
      1. error: 프로그래머가 직접 제어 할 수 없는 오류 ex) stack overflow
      2. exception: 직접 예측하여 막을 수 있는 처리 가능한 오류
    2. 예외 발생 시 try-catch로 처리하는 것이 일반적이지만, throws를 통해 메소드를 호출한 곳으로 예외 처리를 넘길 수 있음 --> 그런 경우 호출 한 함수에서 exception 처리 해줘야 함
     public void method1(){
     try {
     method2(); // throws가 붙은 method2는 반드시 이렇게 try문 안에서 호출되어야 함.
     // method2가 떠넘긴 예외를 아래 catch문을 통해 처리해 주고 있다.
    }
     catch (ClassNotFoundException e1) {
      System.out.println("클래스가 존재하지 않음.");
    }
    
    public void method2() throws ClassNotFoundException {
     Class clazz = Class.forName("java.lang.String22");
    }
    
    1. 모든 예외는 exception 클래스를 상속 받음

  2. 구성

try{

} catch(예외1){

} catch(예외2){

}
  1. 예시 --> exception 객체 생성 어떻게 응용?

    int c;
    try {
        c = 4 / 0;
    } catch(ArithmeticException e) { // <-- 예외 객체 생성
        c = -1;  // 예외가 발생하여 이 문장이 수행된다.
    }
  2. 예외 클래스 종류

    1. NullPointerException(npe)
      1. 객체 참조가 없는 상태 --> 해당 객체가 Null인 상태에서의 접근 한 경우
    2. ArrayIndexOutOfBoundsException
      1. 배열의 인덱스 범위 초과한 경우
    3. NumberFormatException
      1. paseXXX() 메소드들에서 변환할 수 없는 값이 들어온 경우
    4. ClassCastException
      1. 변환할 수 없는 타입으로 억지로 타입변환을 시도한 경우
    5. ArithmeticException
      1. 0으로 나눈 경우

  1. finally

    1. 예외 발생 경우에도 --> 반드시 실행
  2. exception 구분

    1. unchecked exception(runtimeException)
      1. 실행시 발생하는 예외 --> 발생 할 수도 있고 안할 수도 있는 경우 ==> 명시적인 예외 처리를 하지 않아도 됨
    2. checked exception(런타임예외 제외한 나머지 Exception들)
      1. 컴파일시 발생하는 예외 --> 프로그램 작성 시 예측 가능한 예외(일반적으로 사용자로부터 입력받는 경우를 말하는 것 같음) ==> try/catch로 감싸거나 throw를 던져서 반드시 처리해야함
  3. throw(예외 던지기) --> throw 활용?

    1. exception을 위로 보낼 수 있음(나를 호출한 함수에게 예외를 던짐)
    2. 프로그램 수행 여부를 결정하므로 exception 처리의 위치는 중요함
  4. 예외 처리 방법

    1. 예외 복구

      1. 예외 발생 시 --> 미리 예측하여 다른 흐름으로 유도하여 정상적으로 작업 종료
      int maxretry = MAX_RETRY;
      
      while(maxretry -- > 0) {
        try {
            // 예외가 발생할 가능성이 있는 시도
            return; // 작업성공시 리턴
        }
        catch (SomeException e) {
            // 로그 출력. 정해진 시간만큼 대기
        } 
        finally {
            // 리소스 반납 및 정리 작업
        }
      }
      throw new RetryFailedException(); // 최대 재시도 횟수를 넘기면 직접 예외 발생
    2. 예외 처리 회피

      1. 예외 발생 시 호출한 쪽으로 던지고 처리를 회피
      public void add() throws SQLException {
          ... // 구현 로직
      }

사용자 정의 예외

  1. 개발자가 직접 정의하여 만드는 예외(두가지 방식으로 만들 수 있음)

    1. checked exception으로 만들기 위해 --> exception 상속
    2. unchecked exception --> RuntimeException 상속
    
    public class AnyCreateException extends Exception { // <-- 이런 식으로 상속
    	
        public AnyCreateException() {};
    	public AnyCreateException(String message) {
     		super(message);
    // 사용자 정의 예외의 생성. 생성자는 보통 두 가지를 선언하는데
    // 두 번째의 경우 에외 메시지를 전달하기 위해 String 타입의 매개 변수를 갖는 생성자이다.
     	}
    }
    
    .....
    
    public class Account{
    
    	int balance = 100;
        
    	public void withdraw(int money) throws AnyCreateException {
      		if(balance < money){
       			throw new AnyCreateException("Excpetion 발생!");
    // AnyCreateException 의 두 번째 생성자를 선택한 것이다.
    // 모든 예외는 Exception이 가지고 있는 메소드들을 호출 할 수 있다.
    // 그 중 getMessage 메소드가 이 예외 메시지를 리턴한다. 사용은 아래에 구현했다.
     	}
    }
    
    ....
    
    public static void main(String[] args){
    
     	Account account = new Account();
     try{
     	account.wtihdraw(30000);
    }
     catch ( AnyCreateException e ) {
     	String message = e.getMessage(); // 메시지를 담은 생성자를 선택했을 때, 그 메시지를
                                  // getMessage() 메소드가 리턴한다.
     	System.out.println(message);
     	e.printStackTrace(); // 예외가 어디에서 발생했는지 출력해준다.
    }

0개의 댓글