我正在尝试创建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个 -
答案 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
完全相同,因为你使用了反射
希望它有所帮助。