에러 (error)
- 프로그램 수행 시 치명적 상황이 발생하여 비정상 종료 상황이 발생하는 것
에러의 종류
- 컴파일 에러 : 소스코드 상의 문법 에러로 소스코드를 수정하여 해결가능
- 런타임 에러 : 프로그램 실행 중에 발생하는 에러로 사용자로부터 잘못된 값을 입력받거나 계산식의 오류 등으로 발생
- 시스템 에러 : 컴퓨터 하드웨어 오작동 또는 고장으로 인해 발생하는 에러로 소스코드를 수정하여 해결이 불가능
예외(Exception)
- 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류
- if 문 또는 예외 처리 구문을 통해서 예측 가능한 예외 상황에 대해서 해결이 가능
- 모든 예외는 Exception 클래스를 상속
- Checked Exception : 반드시 예외 처리 필요
- Unchecked Exception : 반드시 예외 처리할 필요 X
CheckedException
- Exception을 상속하고 있는 예외
- 컴파일 시 예외 처리 코드가 있는지 검사하는 예외
- 예외 처리가 되어있지 않으면 컴파일 에러를 발생(try ~ catch, throws)
- 조건문이나 소스코드 수정으로는 해결이 되지 않는다.
- 주로 외부에 매개체와 입출력이 일어날 때 발생
UnCheckedException**
- RuntimeException을 상속하고 있는 예외
- 컴파일 시 예외 처리 코드가 있는지 검사하지 않는 예외
- RuntimeException 같은 경우엔 프로그램 실행할 때 문제가 발생되는 것이기 때문에 충분히 예측이 가능하기 때문에 조건문들을 통해서 충분히 처리가 가능
예외 처리
- 예외 처리 코드 : 프로그램에서 예외가 발생했을 경우 프로그램의 갑작스러운 종료를 막고 정상 실행을 유지할 수 있도록 처리하는 코드
try-catch-finally
- try 블록에는 예외가 발생할 가능이 있는 코드가 위치
- try 블록의 코드에서 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이동하여 예외 처리 코드를 실행
- finally 블록은 생략이 가능하고 예외 발생 여부와 상관없이 항상 실행할 내용이 있을 경우에 finally 블록을 작성
try {
...
} catch (Exception e) {
...
} finally {
...
}
throws
- 메소드 내부에서 예외가 발생할 수 있는 코드를 작성할 때 try-catch 블록으로 예외를 처리하는 것이 기본이지만, throws 키워드를 통해서 메소드를 호출한 곳으로 예외를 떠넘길 수도 있다.
- throws 키워드는 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않는 예외를 호출한 곳으로 떠넘기는 역할을 한다.
public String readLine() throws IOException {
...
}
- throws가 붙어있는 메소드는 반드시 try 블록 내에서 호출되어야 한다. 만약 throws가 붙어있는 메소드를 호출한 곳에서 처리하지 않으려면 throws 키워드로 다시 예외를 떠넘기는게 가능
예외와 오버라이딩
- 부모 클래스의 메소드를 자식 클래스에서 오버라이딩 시 메소드가 throws 하는 Exception과 같거나 하위 클래스이어야 한다.
public class Parent {
public void method() throws IOException {
...
}
}
public class Child extends Parent {
@Override
public void method() throws EOFException {
. . .
}
}
public class Child extends Parent {
@Override
public void method() throws Exception {
. . .
}
}