예외 종류 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초간 프로그램 쉬게 하기
}
}