throws IOException
- throws IOException
구문 그대로 해석을 해 보면, [입출력 예외를 던진다] 입니다.
자바에서는 런타임시에 발생할 수 있는 여러가지 예외들을 처리하는
별도의 메카니즘을 가지고 있습니다. throws 키워드는 실행시간에
예외가 발생했을 경우 해당 예외를 직접처리하지 않고 다른 곳에서
처리하도록 예외를 던지겠다 라는 의미입니다.
예외를 직접처리하는 경우와 던지는 경우의 예는 다음과 같습니다.
- 직접처리할 경우.
method a() {
try {
// 실행시간에 예외가 발생할 수 있는 코드들..
} catch (Exception e) {
// 예외발생시에 처리할 코드들..
}
}
위와 같이 try - catch 블록을 써서 예외를 직접 받아서(catch) 처리할 경우는
try 블록 내에서 예외가 발생했을 때, 예외가 던져지고(throw), 이 던져진 예
외는 catch 블록에 의해서 받아져서 결국, catch 블록내의 코드들이 실행됩니다.
이 경우에는 예외가 발생하더라도 catch 블록에 의해 처리되고 난 후, catch
블록 이 후의 코드들이 계속해서 실행 될 수 있습니다.
- 예외를 던질 경우.
method a() throws Exception {
// 실행시간에 예외가 발생할 수 있는 코드들..
}
이 처럼 예외를 직접처리하지 않고 던지는 경우에는, 예외가 발생하면 a() 메
소드의 예외발생 지점부터 그 후의 코드들은 실행이 중단되며, a() 메소드를
호출한 다른 메소드에게 예외가 던져집니다(throw). 만약 main() 메소드에서
a() 메소드를 호출했다면, 해당 예외는 main() 메소드에게로 전달되고, main()
메소드에서도 직접 처리하지 않고 예외를 던질경우 자바가상머신(JVM)이 해당
예외를 받아서 처리하게 됩니다. 즉, 이렇게 예외를 던질경우는 예외발생 즉시
코드의 실행은 중단되며, 결국 JVM에 의해 예외에 대한 레포트가 화면에 출력
되고 프로그램이 종료됩니다.
- 또한 다음과 같이 의도적으로 예외를 발생시켜서 던질 수도 있습니다.
method a() throws MyException {
if (// 예외발생 조건이 만족되면..) {
throw new MyException();
}
}
위와 같이 의도적으로 예외를 발생시켜서 이를 try - catch 블록으로 처리 하던지
아니면 a() 메소드를 호출한 메소드로 던지던지 할 수 있습니다. 이 예제의 경우
위와 같이 하기 위해서는 다음과 같은 형태의 MyException 클래스가 정의되어 있
어야 합니다.
class MyException extends Exception {
// MyException 클래스 정의 코드들..
}
위와 같이 예외를 던지기 위한 클래스 정의의 경우는 일반적으로 Exception
클래스를 상속받아서 작성하며, 이는 예외를 던지는 메카니즘을 구현하기 위한
방법입니다. 참고로 Exception 클래스는 Throwble 클래스의 하위 클래스이며
Throwble 클래스가 모든 예외나 에러 클래스들의 슈퍼클래스 이며, throws 메카
니즘의 출발점이 됩니다.
따라서 자바에서 모든 예외클래스 들은 Exception 클래스를 상속받고 있으며,
입출력(IO)에 관련되 예외 인스턴스를 정의한 클래스가 질문자 분께서 질문한
IOException 클래스 이며, java.io 패키지 내에 정의되어 있습니다. 따라서
코드내에 IOException 클래스에 대한 선언을 하기 위해서는 java.io 패키지를
import 해야 하며, 그렇지 않을 경우, 항상 java.io.IOException 과 같이 전체
경로를 명시해 줘야 JVM이 제대로 클래스를 찾아갈 수 있습니다.
* 출처 : 네이버 지식인 cbr399