개발자가 미리 에측하여 방지할 수 없고 시스템이 종료될 정도로 수습할 수 없는 심각한 문제이다.
가장 흔한 오류들
StackOverflowError : 호출의 깊이가 깊어지거나 재귀가 지속되어 stack overflow를 발생 시키는 오류
대처방법 : 딱히 대처 방법이 존재하지 않음 -> 발생할지 안할지 예측이 어려움
고로 에러가 발생되고 나서 루프를 빠져나오면 해결됨
OutOfMemoryEror : 할당된 메모리의 부족으로 더 이상 객체를 할당할 수 없을때 던져지는 오류
대처 방법 : jvm옵션 수정, heap사이즈 확대 등
그 외의 오류들
개발자가 구현한 로직에서 발생한 실수나 사용자의 영향으로 발생함.
오류와 달리 개발자가 미리 예측하여 방지할 수 있어 상황에 맞는 예외처리를 해줘야한다.
ex) IOException,SQLException 등
// Exception상속 -> Checked Exception
// Position이라는 객체의 positon이 유효하지 않을 경우 던져진다.
public class InvalidPositionException extends Exception {
public InvalidPositionException(String message) {
super(message);
}
}
// InvalidPositionException가 발생하면 해당 생성자를 호출한 메서드로 Exception을 전달하기 위해 throws 예약어를 사용한다.
public class Position {
public Position(String position) throws InvalidPositionException {
if (position.length() != 2) {
throw new InvalidPositionException(position + "은 위치 값 형식에 맞지 않습니다.");
}
x = (int) (position.charAt(0) - 'a');
y = Integer.parseInt(position.substring(1))-1;
}
[...]
}
출처 : https://toneyparky.tistory.com/40
ex) NullPointerException, IndexOutOfBoundException
public class DuplicateEmailException extends RuntimeException{
public DuplicateEmailException(String message) {
super(message);
}
}
public void checkEmail(String memberEmail) throws DuplicateEmailException {
if (memberRepository.findByEmail(memberEmail).isPresent()) {
throw new DuplicateEmailException("이미 존재하는 이메일입니다.");
}
}
예외처리를 해야하는가 하지 않아도 되는가!!!!!!
CheckedException은 반드시 예외처리 체크!!
UncheckedException은 예외처리 안해도댐!!
구분 | Checked Exception | Unchecked Exception |
---|---|---|
확인 시점 | 컴파일 시점 | 런타임 시점 |
예외 처리 | 명시적 예외처리 강제 | 명시적 예외 처리 하지않음 |
트랙잭션 처리 | 예외 발생 시 롤백X | 예외 발생 시 롤백O |
종류 | IOException, FileNotFoundException | NullpointException, ClassCastException |
ps)
compile time = 기계가 읽을 수 있는 형태로 변환
runtime = 변환된 exe파일을 실행하는 것
즉 complie 진행 후 run 고로
Checked Exception은 컴파일에서 확인하고 예외발생 고로 런타임까지 가지 않음
Unchecked Exception은 컴파일은 되나 런타임에서 예외가 발생하는 것
말그대로 throw Exception
public class LoginService implements UserDetailsService {
private final MemberRepository memberRepository;
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
Member member = memberRepository.findByEmail(email)
.orElseThrow(() -> new UsernameNotFoundException("해당 이메일이 존재하지 않습니다."));
return org.springframework.security.core.userdetails.User.builder()
.username(member.getEmail())
.password(member.getPassword())
.roles("USER")
.build();
}
}
try {
// exception이 발생할 만한 코드
} catch (XXException e) {
// exception이 발생할 만한 코드
} catch (YYException e) {
// exception이 발생할 만한 코드
} catch (Exception e) {
// exception이 발생할 만한 코드
}
다중 catch 문장 작성 순서 유의사항