💡Point
컴파일 에러는 소스 코드를 javac.exe로 컴파일 하는 과정에서 컴파일러가 전반적인 코드를 체크해서 에러 메세지를 보여주는 형태
IDE에서는 일정 주기로 계속 자동으로 컴파일을 해주기 때문에 바로바로 문제를 알 수 있음
💡예외 처리란?
프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 행위
프로그램 실행 도중에 발생하는 에러는 어쩔 수 없지만, 예외는 프로그래머의 실력에 따라 충분히 포괄적으로 방지할 수 있음
따라서 예외 처리의 목적은 예외의 발생으로 인한 실행 중인 프로그램의 갑작스런 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것

| Checked Exception | Unchecked Exception | |
|---|---|---|
| 확인 시점 | 컴파일 단계 | 런타임 단계 |
| 처리 여부 | 반드시 예외를 처리해야 함 | 명시적인 처리를 안해도 됨 |
| 트랜잭션 처리 | 예외 발생 시 롤백(rollback) X | 예외 발생 시 롤백(rollback) O |
| 예외 종류 | RuntimeException을 제외한 Exception 클래스와 그를 상속받는 하위 예외 (IOException, FileNotFoundException, SQLException 등) | RuntimeException 과 그 하위 예외 (NullPointerException, IllegalArgumentException, IndexOutOfBoundException, SystemException 등) |
// try - catch 로 예외처리
public static void fileOpen() {
// 파일을 열고 쓰고 닫는 아주 단순한 로직이어도 이에 대한 예외는 checked exception으로 분류 되기 때문에 반드시 try - catch로 감싸주어야 한다.
try {
FileWriter file = new FileWriter("data.txt");
file.write("Hello World");
file.close();
} catch(IOException e) {
e.printStackTrace();
}
}
// -------------------------------------------------------------------------
// throws 로 예외처리
public static void fileOpen() throws IOException {
// 파일을 열고 쓰고 닫는 아주 단순한 로직이어도 이에 대한 예외는 checked exception으로 분류 되기 때문에 반드시 try - catch로 감싸주어야 한다.
FileWriter file = new FileWriter("data.txt");
file.write("Hello World");
file.close();
}
//재시도를 통해 예외를 복구하는 코드
int maxretry = MAX_RETRY;
while(maxretry-- > 0) {
try{
//예외가 발생할 가능성이 있는 시도
return; //작업 성공 시 리턴
} catch (SomeException e) {
//로그 출력
//정해진 시간만큼 대기
} finally {
//리소스 반납 및 정리 작업
}
}
throw new RetryFailedException(); //최대 재시도 횟수를 넘기면 직접 예외 발생
public void add() throws SQLException {
//구현 로직
}
//조금 더 명확한 예외로 던짐
public void add(User user) throws DuplicateUserIdException, SQLException {
try{
//
} catch(SQLException e) {
if(e.getErrorCode() == MysqlErrorNumbers.ER_DUP_ENTRY) {
throw DuplicateUserIdException();
}
else throw e;
}
}
//예외를 단순하게 포장
public void someMethod() {
try{
//
}
catch(NamingExceptin ne) {
throw new EJBException(ne);
}
catch(SQLExceptin se) {
throw new EJBException(se);
}
catch(RemoteExceptin re) {
throw new EJBException(re);
}
}