티스토리 뷰

반응형

Class 클래스중에 forName 메소드를 호출할 때 발생하는 예외인 ClassNotFoundException 을 알아보자.

아래와 같이 프로젝트 하나 만들고 패키지도 2개 만들어 주자.



첫번째로 com.reflection.target 패키지 안에 TargetClass1 클래스를 만들자.

클래스 안에 아무것도 안넣어도 된다. 그냥 Class.forName 으로 찾을 타켓 클래스를 만드는 것뿐이니까.

package com.reflection.target;

public class TargetClass1 {

}


두번째로 Class.forName 를 실행할 테스트 클래스를 만들자. 앞에 만든 클래스를 가지고 테스트하게 된다.

package com.reflection.sample;

public class ClassForNameSample {
	
	public void execute(){
		
		try {
			Class clazz = Class.forName("com.reflection.target.TargetClass99");
			System.out.println("정상종료");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	public static void main(String[] args){
		new ClassForNameSample().execute();
	}
}


실행하면 알겠지만, 예외없이 "정상종료" 메시지가 출력되면서 프로그램이 종료된다.

저 ClassNotFoundException 예외는 언제 발생하는 것일까.

com.reflection.target 패키지에 있지도 않는 TargetClass99 라고 고쳐서 실행해보자.

Class clazz = Class.forName("com.reflection.target.TargetClass99");


java.lang.ClassNotFoundException: com.reflection.target.TargetClass99
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at com.reflection.sample.ClassForNameSample.execute(ClassForNameSample.java:8)

    at com.reflection.sample.ClassForNameSample.main(ClassForNameSample.java:18)


없는 클래스를 찾으니 당연히 예외가 발생해버리게 된다.



이번엔 클래스명은 맞게 하고 패키지 정보를 틀리게 넣어보자.

Class clazz = Class.forName("com.reflection.TargetClass1");

java.lang.ClassNotFoundException: com.reflection.TargetClass1
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at com.reflection.sample.ClassForNameSample.execute(ClassForNameSample.java:8)
    at com.reflection.sample.ClassForNameSample.main(ClassForNameSample.java:18)


당연히 에러다. 클래스명 뿐만 아니라 패키지정보 역시 정확히 넣지 않으면 똑같은 에러가 발생하니 유념해야 한다.








반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함