2021. 04. 20(火)TIL



Java


例外処理


カスタム例外クラス

  • Checked例外クラスの作成
  • Exceptionクラスを継承し、カスタム例外クラスを作成します.
  • Unchecked例外クラスの作成
  • RuntimeExceptionクラスを継承し、カスタム例外クラスを作成します.
  • 現在、多くの人がUncheckedカスタム例外クラスが好きです.
  • 定義
  • カスタム例外クラス
      public class MyException extends RuntimeException {
        public MyException() {}
        public MyException(String message) {
          super(message);
        }
        public MyException(String message, Throwable cause) {
          super(message, cause);
        }
        public MyException(Throwable cause) {
          super(cause);
        }
      }
  • Throwableクラスには、ミラーメッセージ、関連する例外を格納するメンバー変数があり、初期化された作成者があるため、親クラスの作成者によってオブジェクトを初期化できます.
  • 変換例外

  • 実際に発生する異常ではなくカスタム異常を発生する
  • .
  • throwキーワードを使用します.
  • throw新異常クラス(エラーメッセージ、実際に発生した異常)
  • の複数の例外の処理と比較して、カスタム例外のみを処理することを目的としている.
  • 異常処理
      try {
        예외발생이 예상되는 코드 // SQLException 이 발생예상됨
      } catch (SQLException e) {
        throw new 사용자정의예외클래스("메세지", e);
      }
  • に変換する.

    強制異常発生

  • ビジネスロジック上のエラー(パスワードの不一致、残高不足、ログイン失敗など)が発生した場合、強制的に異常が発生し、その機能を呼び出した側にエラーが発生したことを通知します.
  • throwキーワードを使用します.
  •   public void login(String id, String password) {
        User savedUser = userService.getUser(id);
        if (savedUser == null) {
          throw new UserNotFoundException("아이디가 존재하지 않습니다.");
        }
        if (!savedUser.getPasswrd.equals(password)) {
          throw new NotMatchedPasswordException("비밀번호가 일치하지 않습니다.");
        }
        ...
      }
  • package day2;
    
    public class HTAUncheckedException extends RuntimeException {
    
    	public HTAUncheckedException(String msg) {
    		super(msg);
    	}
    	
    	public HTAUncheckedException(String msg, Throwable couse) {
    		super(msg, couse);
    	}
    }
    
    package day2;
    
    // 사용자 정의 예외 클래스 작성하기
    public class HTACheckedException extends Exception {
    
    	public HTACheckedException(String msg) {
    		super(msg);
    		
    	}
    	
    	public HTACheckedException(String msg, Throwable cause) {
    		super(msg, cause);
    	}
    }
    
    package day2;
    
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class ExceptionApp2 {
    
    	public static void test1() throws HTACheckedException {
    		try {
    			BufferedReader reader = new BufferedReader(new FileReader("src/day2/sample1.txt"));
    			String text = reader.readLine();
    			System.out.println("### 파일내용 : "+ text);
    			reader.close();
    		} catch (FileNotFoundException cause) {
    			// FileNotFoundException을 가로채고 대신 HTACheckedException을 발생시킴
    			throw new HTACheckedException("파일경로가 올바르지 않음", cause);
    		} catch (IOException cause) {
    			throw new HTACheckedException("파일 읽기 오류", cause);
    		}
    	}
    	
    	public static Date strToDate(String dateString) throws HTACheckedException {
    		try {
    			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    			return format.parse(dateString);
    		} catch (ParseException cause) {
    			throw new HTACheckedException("올바른 날짜 형식이 아닙니다.", cause);
    		}
    	}
    	
    	public static void main(String[] args) {
    		try {
    			test1();
    			Date day = strToDate("2021-12-25");
    		} catch(HTACheckedException e) {
    			e.printStackTrace();
    		}
    	}
    }
    
    package day2;
    
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class ExceptionApp3 {
    
    	public static void test1() {
    		try {
    			BufferedReader reader = new BufferedReader(new FileReader("src/day2/sample1.txt"));
    			String text = reader.readLine();
    			System.out.println("### 파일 내용 : " + text);
    			reader.close();
    		} catch (FileNotFoundException e) {
    			throw new HTAUncheckedException("파일경로가 올바르지 않습니다", e);
    		} catch (IOException e) {
    			throw new HTAUncheckedException("### 파일읽기 오류 발생하였습니다", e);
    		}
    	}
    	
    	// 강제 발생시킨 HTAUncheckedException 예외는 컴파일러가 예외처리 여부를 체크하지 않는 예외다.
    	// 따라서, strToDate() 메소드 내부에서 HTAUncheckedException 예외를 강제 발생시켜도
    	// 예외
    	public static Date strToDate(String dateString) {
    		try {
    			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    			return format.parse(dateString);
    		} catch (ParseException cause) {
    			throw new HTAUncheckedException("올바른 날짜 형식이 아닙니다", cause);
    		}
    	}
    	
    	public static void main(String[] args) {
    		// test1()과 strToDate() 메소드는 예외처리를 강제하지 않는
    		// Unchecked예외를 발생시키는 메소드다
    		// test1()과 strTodate() 메소드를 사용하는 측에서는 예외처리를 하지 않아도 된다.
    		test1();
    		Date day = strToDate("2010-01-01");
    		System.out.println(day);
    		
    		// 필요에 따라서 예외처리를 일괄적으로 구현해도 상관없다.
    		try {
    			test1();
    			Date day2 = strToDate("2010-01-01");
    			System.out.println(day2);
    		} catch(HTAUncheckedException e) {
    			e.printStackTrace();
    		}
    	}
    }