회복이 불가능한 문제
시스템 레벨 혹은 환경적인 이유로 발생
회복이 가능한 문제
회복이 가능하다는 전제는 우리가 그 예외가 발생할 수 있다는 것을 인지하고 대응하는 것
① 컴파일 에러
.java 파일을 .class 파일로 컴파일 할 때 발생하는 에러
대부분 자바 프로그래밍 언어의 규칙을 지키지 않았을 때 발생
ex)
문법에 맞게 다시 작성하면 해결
② 런타임 에러
① 확인된 예외(Checked Exception)
② 미확인된 예외(Unchecked Exception)
런타임 시점에 확인되는 예외
예외 처리가 반드시 필요하지 않은 예외
class OurBadException extends Exception {
public OurBadException() {
super("위험한 행동을 하면 예외처리를 꼭 해야합니다!");
}
}
public class OurClass {
private final boolean just = true; // final이 있기 때문에 절대 바꿀 수 없음
// throws : 던지다!!(=예외를 던지다 / 발생시키다)
public void thisMethodIsDangerous() throws OurBadException{ // Exception도 가능하지만 더 구체적으로 하기 위해 사용
// custom logic이 들어있음
if (just) {
throw new OurBadException();
}
}
}
throws | throw |
---|---|
메서드 이름 뒤에 붙어(=> method throws ~Exception) 이 메서드가 어떠한 예외사항을 던질 수 있는지 알려주는 예약어 | 메서드 안에서, 실제로 예외 객체를 던질 때 사용하는 예약어 |
여러 종류의 예외사항을 적을 수 있음 => extends Exception | 실제로 던지는 예외 객체 하나와 같이 써야 함 => throw new ~Exception |
일반 메서드의 return 키워드처럼 throw 아래의 구문들은 실행되지 않고, throw문과 함께 메서드가 종료됨 |
throw new ~Exception : 새로운 Exception 객체를 만들어서 던진다.
throws Exception : 디테일한 예외 사항을 적을 수 없음
public class StudyException {
public static void main(String[] args) {
OurClass ourclass = new OurClass();
// try ~ catch ~ finally 구문
// try : 시도하다
// catch : 잡다(붙잡다)
// finally : 마침내
// 일단 try해 ~~~ 그리고, 예외가 발생하면 그걸 잡아!!(catch)
// 그리고, 정상적으로 수행되든. 예외가 발생하든 결국 마침내 수행해야 하는 로직을 'finally' 수행해
try {
// 1. 위험한 메소드의 실행을 "시도"(일단 실행)
// "시도" 해보는 코드가 들어가는 블럭
ourclass.thisMethodIsDangerous(); // OurClass에서 위험하다고 예외처리를 했는데 호출하고 있어 빨간줄이 표시됨
} catch (OurBadException e) { // () 필수 왜? 무슨 종류의 예외 사항을 catch할 것인지를 명시해줘야 하니까
// 2. 예외가 발생하면, "잡아서" handling
// 예외가 발생하는경우 "handling" 하는 코드가 들어가는 블럭
// 즉 try 블럭 내의 구문을 실행하다가 예외가 발생하면
// 예외가 발생한 줄에서 바로 코드 실행을 멈추고
// 여기 있는 catch 블럭 내의 코드가 실행됨
System.out.println(e.getMessage()); // error 객체가 가지고 있는 오루 내용을 출력
} finally {
// 무조건 여기는 거침!!!
System.out.println("우리는 방금 예외를 handling 했습니다. 정상처리되든, 예외사항이 발생하든 여기를 거쳐요!!");
}
}
}
위험을 감지했을 때 try-catch finally 사용
try** - **catch
는 각각 중괄호{}
를 통해 실행할 코드들을 담는다.
try
단어의 “시도한다” 라는 뜻에 맞게 의 중괄호{}
안에는 예외가 발생할 수 있지만 실행을 시도할 코드를 담는다.
catch
단어의 “잡는다”라는 의미에 맞게 중괄호{}
안에는 try
안에있는 코드를 실행하다가 예외가 났을때 실행할 코드를 담는다.
catch
는 소괄호()
를 통해 어떤 예외클래스를 받아서 처리할지 정의catch
로 모든 예외를 다 받고 싶으면 Exception
을 넣어주면 됨catch
로 일부 예외만 받아서 처리하고 싶으면 해당 예외 클래스명을 넣어주면 됨try
문에 catch
문은 여러개 사용 가능try
: 4catch
기존 try - catch
의 맨 마지막에 finally
를 붙여서 마지막에 반드시 실행할 코드를 넣을 수 있음