
컴파일 에러 : 컴파일 시에 발생하는 에러
런타임 에러 : 실행 시에 발생하는 에러
논리적 에러 : 실행은 되지만, 의도와 다르게 동작하는 것
아래 이미지처럼 모든 클래스의 조상은 Object클래스이므로 Exception과 Error클래스 역시 Object클래스의 자손들이다.

모든 예외의 조상은 Exception이다.

Exception 클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
RuntimeException 클래스들 : 프로그래머의 실수로 발생하는 예외
try{
// 예외가 발생할 가능성이 있는 문장
} catch (Exception1 e1){
// Exception1이 발생했을 경우, 이를 처리하기 위한 문장
} catch (Exception2 e2){
// Exception2이 발생했을 경우, 이를 처리하기 위한 문장
} catch (ExceptionN eN){
// ExceptionN이 발생했을 경우, 이를 처리하기 위한 문장
}
printStackTrace() : 예외발생 당시의 호출 스택(Call Stack)에 있었던 메서드의 정보와 예외 메세지를 화면에 출력한다.
getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있다.
try{
...
} catch (ExceptionA | ExceptionB e){
e.printStackTrace();
}
먼저 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음 키워드 throw를 이용해서 예외를 발생 시킨다.
Exception e = new Exception("고의로 발생시켰음");
throw e;
void method() throws Exception1, Exception2, ..., ExceptionN{
... // 메서드의 내용
}
예외를 발생시키는 키워드 throw와 예외를 메서드에 선언할 때 쓰이는 throws 구별 필요!
import java.io.*;
class ExceptionEx16{
public static void main(String[] args){
try{
File f = createFile(args[0]);
System.out.println(f.getName() + "파일이 성공적으로 생성");
} catch (Exception e) {
System.out.println(e.getMessage()+" 다시 입력");
}
} // main 메서드 끝
static File createFile(String FileName) throws Exception{
if (FileName == null || fileName.equals(""))
throws new Exception("파일 이름 유효x");
File f = new File(fileName);
f.createNewFile();
return f;
}
}
### 1.8 finally 블럭
- finally블럭은 예외의 발생여부와 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용된다. try-catch문의 끝에 선택적으로 덧붙여 사용할 수 있으며, try-catch-finally의 순서로 구성된다.
```java
try {
// 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception1 e1) {
// 예외처리를 위한 문장을 적는다.
} finally {
// 예외의 발생여부에 관계없이 수행되어야 하는 문장들을 넣는다.
// finally블럭은 try-catch문의 맨 마지막에 위치해야 한다.
}
가능하면 새로운 예외 클래스를 만들기보다 기존의 예외클래스를 활용하는 것이 좋다.
class MyException extends Exception{
MyException(String msg){
super(msg);
}
}