抛出InvocationTargetException试图创建String的新实例

时间:2014-03-16 15:59:34

标签: java reflection invocationtargetexception

我正在尝试创建String类的新实例,在某些情况下我得到了Exception。 就像我在制作4个参数(byte [],int,int,int)的构造函数时,我得到了它,当我做2个参数的构造函数时,一切都还可以。

public static Object makeNewInstance(Constructor<?> con) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
        @SuppressWarnings("resource")
        Scanner sc = new Scanner(System.in);
        Class<?>[] paraListTypes = con.getParameterTypes();

        Object[] valArr = new Object[paraListTypes.length];


        for(int i=0;i<paraListTypes.length ; i++){
            if(paraListTypes[i].isPrimitive()){
                System.out.println("Enter " + paraListTypes[i].toString() + " value:");
                valArr[i] = getOneValue(paraListTypes[i].toString());
            }
            else if(paraListTypes[i].isArray()){
                valArr[i] = makeNewArray(paraListTypes[i]);
            }
            else{
                System.out.println(paraListTypes[i]);
                valArr[i] = printAllConstructorsAndChooseOne(paraListTypes[i]);

            }
        }
        try{

        return con.newInstance(valArr);
        }

        catch(InvocationTargetException e){
            System.out.println(e);
        }
        return null;


    }

获得的完整跟踪追踪是:

sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知)中sun.reflect.NativeConstructorAccessorImpl.newInstance(未知来源)的sun.reflect.NativeConstructorAccessorImpl.newInstance0(本地方法)中的线程“main”java.lang.reflect.InvocationTargetException中的异常。来自)labs.Ref.makeNewInstance(Ref.java:75)at labs.Ref.main(Ref.java:161)的java.lang.reflect.Constructor.newInstance(未知来源)来源:java.lang.StringIndexOutOfBoundsException :字符串索引超出范围:java.lang.String.checkBounds(未知来源)9 ...还有7个 -

1 个答案:

答案 0 :(得分:0)

String的4个参数构造函数的最后2个参数是偏移量和从String数组中生成byte的长度。检查偏移+长度是否不大于数组的长度
如果你这样做,例如:

new String("hola".getBytes(), 0,0,5);

你会得到:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5
at java.lang.String.checkBounds(String.java:375)
at java.lang.String.<init>(String.java:314)
at Tmp.main(Tmp.java:13)

InvocationTargetException完全相同,因为你使用了反射
希望它有所帮助。