프로그램 코드에 의해 수습 될 수 있는 상황
try {
// 예외가 발생할 수 있는 코드
}
catch(XXXException e) {
// 예외가 발생했을 때 처리할 코드
}
ㅇㅎ JVM이 예외를 처리하는구나!!!
여러 개의 예외가 발생할 수도 있다!?
어떻게 예외를 처리할 수 있는지 알아보자!!!
다형성
이 적용된다… (다형성이 뭐였더라…)작은 범위(자식)에서 큰 범위(조상) 순
으로 정의Exception
으로 때려 넣으면 되는 거 아님??? 😡어떤 오류가 발생했을까?
finally는 예외 발생 여부와 상관 없이 언제나 실행
try~catch문에서 겹치는 내용을 finally에 작성해주면 되는구나!!!!
💡 겹치는 내용을 굳이 `finally`에서 실행하는 이유는???try~catch문에서 return
을 만나게 되면 바로 함수가 종료되기 때문에 try~catch문 밖의 코드는 실행되지 않지만, finally
를 사용하게 되면 return
을 하기 전에 finally
안의 코드를 먼저 실행하게 된다!!!
try안에 try… 내방처럼 너무 지저분하잖아!?
AutoCloseable interface를 미리 구현해야된다. → 인터페이스니까 무!조!건! 작성해줘야한다고~
public class Test07 {
public static void main(String[] args) {
try (FileReader fr = new FileReader("Test4.txt"); BufferedReader br = new BufferedReader(fr);) {
while (true) {
String line = br.readLine();
if (line == null)
break;
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class Test07 {
public static void main(String[] args) {
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader("Test4.txt");
br = new BufferedReader(fr);
while (true) {
String line = br.readLine();
if (line == null)
break;
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
class MyClose implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("MyClose - close() 호출됨");
}
}
위와 같이 AutoCloseable
을 implements를 해서 직접 구현가능하다…!!!
그리고 finally과 마찬가지로 무!조!건! close()는 실행된다!!!
반드시 예외처리를 해야한다. 즉, 컴파일 시점에서 에러를 발생시킨다. → 프로그램을 실행 시킬 수 없다.
직접처리는 컴파일 시점에서 에러를 발생시킨다.
try
catch
finally
간접 처리는 런타임 시점에 에러를 발생시킨다. 즉, 컴파일 시점에 알 수 없다…ㅠㅠ 🥲
throws XXXException
System.out.println(1 / 0);
과 같은 오류가 대표적💡 사용자 정의 예외 또한 checked와 unchecked를 구별하여 정의할 수 있다. 이것 또한 예외 클래스를 상속 받아서 정의한다!!API에 정의된 exception이외에 필요에 따라 사용자 정의 예외 클래스
JVM은 사용자가 정의한 예외를 알 수 없기 때문에 개발자가 직접! 예외를 발생 시켜야한다.
throw + 발생시킬 예외 객체
의 형태로 직접 예외를 발생시킨다..
여기서 throw는 예외를 돈지는 역할을 한다….
💡 에러 클래스에 따라 에러를 받고 던지고를 판단하는 기준이 된다. (어렵…)throw로 예외를 던질 때 클래스를 던지기 때문에 직접 생성하던지 기존에 생성된 클래스를 던지던지 파악해야한다.
class LottoNumberException extends RuntimeException {
}
class LottoService {
private static final int MAX_NUM = 500;
public int makeNumber() {
Random r = new Random();
int num = r.nextInt(MAX_NUM) + 1;
if (num > 45) {
throw new LottoNumberException();
}
return num;
}
}
public class Test08 {
public static void main(String[] args) {
LottoService service = new LottoService();
try {
System.out.println(service.makeNumber());
} catch (Exception e) {
System.out.println("에러");
}
}
}
위의 코드를 보면 int makeNumber()
에 throws가 없지만 에러를 던진다!!