본문 바로가기

Language/Java

예외 처리, jUnit 단위 Test

08.02 TIL

 

예외 종류
1. 컴파일 예외
- 문제 발생시 컴파일 자체 불가
- 반드시 처리 필수를 의미하는 개념

2. 런타임 에외
- 컴파일 된 후 실행시에 발생되는 예외 의미
- 반드시 상위 타입에 java.lang.RuntimeException 이 존재
- 처리 방식 두가지
1) 값을 유효한 데이터로 수정
2) try~catch로 처리 가능
//문법

//1번
    - try~catch~finally
    
    try{                              // 1
              서비스 로직 구현부
              단, 예외가 발생될 소지 있는 로직
    }catch(예외타입 변수){               // 0 ~ *
               발생된 예외 처리
    }finally{                        // 0 or 1
        100% 무조건 실행 블록
    }   
    
//2번
  - 메소드 또는 생성자의 선언구에 throws~Exception 던지기
  - 예외가 발생 가능성 있는 메소드 또는 생성자 호출 한 곳에서 예외 처리 즉 처리 위임하는 기술
  - API에서 제공하는 모든 메소드는 throws~~~ 즉 사용(호출)하는 우리의 코드예제 처리 위임​

 

//방법 1    
    try{
        //필수 구현 부분 단, 숫자만 입력되어야 하는데 문자가 입력된다면 프로그램 중지 없이 메세지 발생 및 처리
               로직 구현부
    }catch(발생된문제(예외)타입의 변수){
             발생된 문제 처리 영역
    }

 

//방법 2 - 예외 발생 여부와 무관하게 100% 실행 보장 로직이 있을 경우
    try{
        //필수 구현 부분 단, 숫자만 입력되어야 하는데 문자가 입력된다면 프로그램 중지 없이 메세지 발생 및 처리
               로직 구현부
    }catch(발생된문제(예외)타입의 변수){
             발생된 문제 처리 영역
    }finally{
       100% 실행보장
             시스템 자원 반환 로직으로 권장
    }

 

 

예제
package step01;

import java.io.FileNotFoundException;
import java.io.FileReader;

public class ExceptionTest1 {
	//배열 + 런타임 예외
	/* 첫 시도 - 미존재하는 메모리의 index값을 출력 시도
	 *      - 컴파일 OK / 실행시 배열 범위 문제 예외 발생
	 *      - 해결책 : index값만 유효한 메모리 위치값으로 수정 후 컴파일 및 실행
	 */
	static void m1() {
		int [] i = {1, 2, 3, 4};
		System.out.println(i[8]);  //8번째 메모리에는 데이터가 없음/메모리 자체도 없음
	}
	
	/* 두번째 시도 - 미존재하는 메모리의 index값을 출력 시도
	 *      - 컴파일 OK / 실행시 배열 범위 문제 예외 발생
	 *      - 해결책 : 예외 처리 문법으로 실행 유지 되게끔 처리
	 * 단, 예외 발생될 try 블록의 나머지 로직이 혹여 존재할 경우에 실행은 안 되는 현상 발생
	 */
	static void m2() {
		int [] i = {1, 2, 3, 4};
		
		try {
		System.out.println(i[8]);  //8번째 메모리에는 데이터가 없음/메모리 자체도 없음
		//로직이 존재시 예외 발생되면 실행 불가
		}catch(ArrayIndexOutOfBoundsException e) {
			//e.printStackTrace();
		}
		
		System.out.println("예외 발생 여부와 무관하게 실행되어야 할 로직이라 간주");
	}
	
	//컴파일 계열 예외
	//불안정한 상황이 연출될 수도 있는 다양한 경우의 수를 개발시에 미리 안정적인 코드로 개발 가능하게 적용되는 기술
	//반드시 처리 문법 필수 (try~catch)
	
	//연출상황
	//프로그램 실행 도중에 잠시 재우기 - java.lang.Thread에 sleep() 메소드
	//실행중에 멈춘다? 시스템 입장에서는 문제 생긴거 아닌가 하는 우려 보유
	//sleep() 메소드 지원하는 사람이 혹여 실행시 문제 발생 소지가 있으니 처리는 필수로 하자로 제시
	
    static void m3() {
		System.out.println(1);
		int i = 1;
		while(i <= 5) {
		System.out.println(i);
		i++; // i = i + 1;
		
		//try~catch 적용시 문법 오류 없음 즉 필수
		try {
			Thread.sleep(3000);  //3초간 프로그램 쉬게 하기
		} catch (InterruptedException e) {
			e.printStackTrace();
			}  
		}
	}
	/*
	 * 예외 처리의 필요성 - 결과론적으로 실행의 안정성
	 * 컴파일 자체도 안되게 강제적으로 처리 문법 필수로 적용해서 견고한 프로그램 개발 권장
	 */
     
	public static void main(String[] args) {
//		m1();
//		m2();
		m3();
		
		//ArithmeticException 발생 가능성 있음 / 발생되도 RuntimeException 자식 따라서 try~catch는 옵션
		//즉 값만 수정해도 됨
		
		System.out.println(10/0);
	}

}​

 

throws를 이용한 예외 위임 처리
package step01;

public class ExceptionTest2 {
	
	//예외 발생시 처리는 m3() 메소드 호출한 곳에서 하라는 의미
	static void m5() throws InterruptedException {

		int i = 1;
		while(i <= 5) {
		System.out.println(i);
		i++; // i = i + 1;
		
			Thread.sleep(3000);  //3초간 프로그램 쉬게 하기
		}
	}​

 

main 메소드에서 throws는 비추
	/* 실행시 명령어
	 * >java ExceptionTest2
	 * 
	 * java 실행환경(jre)
	 * - 자바 코드가 명령어 인식 후에 해당 클래스의 static main() 호출
	 * - 예외를 main에서 throws 한다는건 예외 처리 방치 (비추)
	 * ExceptionTest2.main([..]);
	 */
	
    public static void main(String[] args)  throws InterruptedException {
		
	}
}​​

 

단위 Test library
- jUnit
http://junit.org

Maven project로 변환

 

pom.xml dependencies 수정

예제
@Test - 애노테이션 사용 (main 메소드 없이 test 가능)
import org.junit.Test;

public class ExceptionTest2 {

	//main() 없이도 단순 test가 가능한 특화된 애노테이션
	@Test
	public void m() {
		System.out.println(1);
	}
	
	@Test
	public void mm() {
		System.out.println(2);
	}
	
//	@Test
	 void m3() throws InterruptedException {

		int i = 1;
		while(i <= 5) {
		System.out.println(i);
		i++; // i = i + 1;
		
			Thread.sleep(3000);  //3초간 프로그램 쉬게 하기
		}
	}​

 

test 결과

 

 

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

DAO pattern  (0) 2021.08.11
JDBC - oracleDB 연동 및 DML  (0) 2021.08.09
Maven project Apache Log4j  (0) 2021.08.01
MVC+ DTO pattern, 자료구조  (0) 2021.07.27
상속, 다형성, MVC pattern  (0) 2021.07.26