예외처리에 대한 예제를 공부하다가 Class.forName() 메서드를 보게되었는데, 이것이 어떻게 동작하는 지에 대해 찾아보게 되었다.
다음 예제는 main메서드에서 throws 키워드를 이용하여 예외를 넘기는 것이다.
public class ThrowExceptionTest {
public static void main(String[] args) {
try {
throwException();
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage()); <----------e.tostring()
}
}
static void throwException() throws ClassNotFoundException, NullPointerException {
Class.forName("j");
}
}
//출력값
j
이경우 자바 JVM이 최종적으로 예외의 내용을 콘솔에 출력하여 예외처리를 수행한다.
출력값의 경우e.getMessage()말고e.tostring()을 이용하면 왜 그 에러가 발생했는지에 대한 이유도 같이 출력되는 것을 볼 수 있다.
위 코드의 경우
throws키워드를 사용하여 해당 예외를 발생한 메서드 내에서 처리하지 않고 메서드를 호출한 곳으로 떠넘기고있다.
따라서 catch 로ClassNotFoundException을 호출한 main메서드가 이 책임을 가진다.
여기서 Class.forName()은 어떤 역할을 하는 것인가?
forName()메서드는 Class 클래스의 메서드로 써 x라는 이름의 클래스를 초기화해준다. 그리고 Class 클래스의 오브젝트를 리턴해준다.
이 말이 조금헷갈릴 수 있어서 부가설명을 하자면, 우리가 생성하는 모든 클래스 들은 Class 클래스에서 관리된다. 따라서 Class.forName("클래스 이름")을 하게되면 해당되는 이름을 가진 클래스를 Class 클래스에서 찾아서 리턴해주는것이다.
만약 해당 이름의 클래스가 존재하지 않는다면 다음 오류를 리턴하게된다 ClassNotFoundException
따라서 위의 예제를 조금 고쳐서 실행해보면
try {
throwException();
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage()); <----------e.tostring()
}
- 위에서
e.getMessage()를e.tostring()으로 바꿔 실행해보면 다음과 같은 메세지가 나온다.java.lang.ClassNotFoundException: j- 이 말의 뜻은 j라는 이름을 가진 클래스를 찾지못했다 라는 뜻이다.
- e.getMessage()를 하면 문제가 되는 원인만 출력된다.
“j” 라는 이름을 가진 메서드는 만들지 않았기에 ClassNotFoundException이 일어난다 -> throws로 넘겨줌
