컴파일 에러 : 문법상 오류
예외(Exception)
: 문법상의 오류가 아닌 "실행중"에 발생되는 오류상황, (기본적으로) 예외가 발생되면 예외 관련 메시지를 출력하고 프로그램이 종료된다.
* 예외처리(Exception handling)에 try ~ catch 를 사용하는 이유
1. if문은 예외 처리 이외의 용도로 사용되기 때문에 프로그램 코드상에서 예외처리 부분을 구분하기가 쉽지 않다.
2. try {} 블럭은 "일반적인 흐름"을 catch {} 블럭은 "예외처리" 블럭으로 만듦으로 코드 분석이 훨씬 용이하다.
* 특히 시스템 자원(resource), HW(파일, DB..) 등을 사용하는 프로그래밍에선 "예외"가 언제든지 발생할 수 있으므로 try ~ catch가 필수적이다.
* try 블럭 안에서 선언된 변수는 try 블럭안에서만 사용되는 지역변수가 된다.
catch 블럭 등 다른 블럭에서도 사용 가능하게 하려면 try 바깥에서 선언해야 한다.
* getMessage(), printStackTrace() 등의 메소드는 Throwable 클래스에 정의되어 있으며,
자식 클래스들은 Throwable에 정의된 메소드들을 사용할 수 있다.
* catch문은 여러개를 사용할 수는 있지만 상위 예외 클래스를 하위 예외 클래스보다 먼저 사용할 수는 없다. (컴파일 에러)
* multi ~ catch : Java 7부터 하나의 catch문에서 여러개의 예외를 처리할 수 있는 방법을 제공한다.
* 주의! 같은 상속 레벨의 exception들만 multi ~ catch 해야한다. (예외 클래스 상속 관계 확인)
* finally : 예외(exception) 발생 여부와 상관없이 항상 실행되어야 할 코드들은 finally 블럭 안에서 작성한다.
즉, finally 블럭 안에 있는 코드들은 항상 실행이 된다.
예외가 발생하지 않을 때에는 try 블럭 안에 코드들이 모두 실행된 후 finally 블럭의 코드들이 실행된다.
예외가 발생할 때는 해당 catch 블럭의 코드들이 실행된 후에 finally 블럭의 코드들이 실행된다.
* 주의! try 블럭이나 catch 블럭 안에 return이 있더라도 finally 블럭 안에 코드들이 다 실행된 후에 return이 실행된다.
* 주의! try 블럭, catch 블럭, finally 블럭등에서 두루두루 사용할 변수는 try 블럭전에 선언하고, 초기화까지 하면 좋다.
* 보통은 자원반납과 같은 것들을 할 때 finally 활용
throws
: 메소드 설계를 할 때 예외 처리를 직접 하지 않은 경우, 메소드 이름 뒤에 throws Exception을 추가하면 메소드를 호출한 곳으로 exception이 던져진다.
"Exception" 및 이를 "직접 상속받은" Exception을 throws 하는 메소드의 경우 이 메소드를 호출하는 쪽에서 반드시 예외 처리(handling)해야 한다.
반면 "RuntimeException" 및 이를 상속바은 예외를 throws하는 메소드는 굳이 호출하는 쪽에서 매번 예외 처리를 할 필요는 없다.