티스토리 뷰

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

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





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

package com.reflection.target;

public class TargetClass3 {
	
	private String str;
	
	public TargetClass3(String str){
		this.str = str;
		System.out.println("TargetClass3(String str) 생성자 호출, 입력값 : "+str);
	}

}





두번째로 com.reflection.sample 패키지 안에 ConstructorSample 클래스를 만들자.

package com.reflection.sample;
 
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
 
public class ConstructorSample {
     
    public void execute(){
         
        Class clazz = null;
         
        try {
            clazz = Class.forName("com.reflection.target.TargetClass3");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         
        Constructor constructor = null;
        Class[] constructorParameterTypes = {String.class};
         
        try {
            constructor = clazz.getConstructor(constructorParameterTypes);
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        
        
        Object[] constructorParameterObjects = {"123"};
        
        try {
			constructor.newInstance(constructorParameterObjects);
			System.out.println(constructor.getName()+ " 생성자로 객체생성 성공.");
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
         
    }
     
    public static void main(String[] args){
        new ConstructorSample().execute();
    }
     
}


실행해보면 알겠지만 잘 된다. 결과는 아래와 같다.


TargetClass3(String str) 생성자 호출, 입력값 : 123
com.reflection.target.TargetClass3 생성자로 객체생성 성공.



자 IllegalArgumentException 예외를 일부러 내보자. ConstructorSample.java 파일의 31 라인을 아래와 같이 바꾸자.

Object[] constructorParameterObjects = {123};

실행하면 에러가 발생한다.


java.lang.IllegalArgumentException: argument type mismatch
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.reflection.sample.ConstructorSample.execute(ConstructorSample.java:34)
    at com.reflection.sample.ConstructorSample.main(ConstructorSample.java:49)


에러의 원인은 무엇일까.

argument type mismatch 라고 나와있다. 분명 ConstructorSample.java 파일의 20 라인에서는 String.class 의 인자를 가진 생성자를 부르겠다고 Constructor 객체를 선언했는데.. 31라인와서는 123 int 형 숫자를 넣어서 객체를 만들겠다고 하니 예외가 발생한 것이다. argument type 은 String으로 선언해놓고 실제로 넣는 값은 int 형으로 넣어서 생긴 문제이다.



IllegalArgumentException 예외에는 이런 경우 말고 argument 갯수가 맞지 않는 경우도 문제가 된다.

ConstructorSample.java 파일의 31 라인을 아래와 같이 바꿔서 실행해보자.

Object[] constructorParameterObjects = {"123", "456"};

java.lang.IllegalArgumentException: wrong number of arguments


wrong nuber of arguments 이다. 왜 String.class 한개만 받는 생성자를 호출하겠다고 선언했으면서 실질적으로 String 객체 2개를 넘겨주는 것이냐 이말이다. 선언한 타입과 실질적으로 넘겨준 객체의 갯수가 매치가 되지 않아서 발생한 경우이다.





반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함