0

我正在尝试创建 String 类的新实例,但在某些情况下出现异常。就像当我正在制作 4 个参数的构造函数(字节 []、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.NativeConstructorAccessorImpl.newInstance(Unknown Source) 处 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 处 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 处的线程“main”java.lang.reflect.InvocationTargetException 中的异常java.lang.reflect.Constructor.newInstance(Unknown Source) at labs.Ref.makeNewInstance(Ref.java:75) at labs.Ref.main(Ref.java:161) 原因:java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:9 在 java.lang.String.checkBounds(Unknown Source) ... 7 更多 –

4

1 回答 1

0

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


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因为您使用了反射。

希望能帮助到你。

于 2014-03-16T17:53:08.380 回答