1.컴파일에러= 컴파일 시에 발생하는 오류
2. 런타임 에러= 실행 시에 발생하는 오류
3. 논리적 에러 = 실행은 되지만, 의도와 다르게 동작
printStackTrace() = 예외발생 당시의 호출스택 에 있었던 메서드의 정보와 예외 메세지 화면에 출력
getMessage() 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
예외가 발생하면 해당클래스 인스턴스 생성된다.
예외 클래스의 객체를 만든다음
Exception e= new Exception("쓰고싶은 메세지" getMessage로 호출)
throw e으로 예외 발생
합쳐서 thorw new Exception("쓰고싶은 메세지" getMessage로 호출)
프로그래머에 의 한 실수로 발생하는 RuntimeException은 예외 처리를 강제로 하지 않는다. However, 실행 오류는 난다. 이러한 예외들을 unchecked 예외 라고 부르고 예외 처리를 확인하는(강제성 있는) Exception 클래스들은 checked 예외 라고 부른다.
thorws
(메서드 throws 예외) 이런식으로 메서드 내에서 발생할수 있는 예외를 적어준다.
RuntimeException 은 적지 않는다(강제성 x, 그래서 컴파일떄는 오류가 안나고 돌리면 오류가 난다..)
-반드시 처리 해야할 예외만 선언한다(강제성 o)
※사실 thorws 예외를 처리하는게 아니라 (에러가 있는)메서드를 호출한 메서드에게 떠맡기는 것이다.
즉 예외처리 방법은 크게
1.메서드 내부에서 try-catch 문으로 잡는다
2.throws 로 이메서드는 오류가 있다는것을 선언한뒤 그메서드를 선언한 메서드에게 try-catch문을 떠넘긴다.
입출력 하고나서는 꼭 닫아줘야 사용했던 자원(resources)가 반환 된다.
try-with-resouces 괄호 ()에 객체를 생성하는 문장을 넣으면, 이객체는 따로 close()를 호출하지 않아도 try블럭을 벗어나느 순간 자동적으로 close가 호출된다.
clsoe 자동 호출 하려면 클래스가 AutoCloseable이라는 인터페이스를 구현해야 한다.
public interface AutoCloseable{
void close() throws Exception;
}
-supprresed 예외
※자동 처리되는 close()에서도 오류가 발생 할수 있다. 일반적 오류 + close 오류 = 두예외가 동시에 발생할 수는 없기 떄문에 일반오류를 실제 발생한 예외로 취급하고 , close오류는 억제된 예외(suppressed)로 처리한다. 억제된 예외에 대한 정보는 실제발생한 일반 예외에 저장된다.
※ 반환 값이 있는 retrun문의 경우, catch 블럭에도 retrun문이 있어야한다. 예외가 발생 했을 경우에도 값을 반환해야하기 떄문이다.(예외가 있어도 그걸처리하고 정상종료를 해야하기 떄문)