使用class.newInstance()创造实例会报java.lang.InstantiationException异常
Java类如果定义了有参构造函数但是没有无参构造函数,用 class.newInstance()就会报异常java.lang.InstantiationException
@Getter
@Setter
@AllArgsConstructor
public class User {
private int age;
private String name;
public static void main(String[] args) {
try {
User.class.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
}
}
结果:
java.lang.InstantiationException:User
at java.lang.Class.newInstance(Class.java:427)
at User.main(User.java:25)
Caused by: java.lang.NoSuchMethodException: User.()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.newInstance(Class.java:412)
… 1 more
异常原因:因为没有无参构造函数,而 User.class.newInstance();只能调用User的无参构造函数,所以获取无参构造方法失败。
解决方法:
1.加上无参构造方法,在User类上加上@NoArgsConstructor
2.删除@AllArgsConstructor注解,使用默认无参构造方法。
另外一种情况也会出现InstantiationException异常,具体如下异常:
错误: 未报告的异常错误InstantiationException; 必须对其进行捕获或声明以便抛出 mDialog = (T) clazz.newInstance(); ^
具体实例如下:
/**
* 创建fragment的静态方法,方便传递参数
*
* @return
*/
public static <T extends BaseDialog> void open(FragmentManager manager, Class clazz, Bundle args, DialogOptions options) {
try {
T mDialog = null;
mDialog = (T) clazz.newInstance();
mDialog.setOptions(options);
if (args != null) mDialog.setArguments(args);
mDialog.show(manager, mDialog.getClass().getSimpleName());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
上面实例会报异常,使用try catch捕获一下就好了,如下:
/**
* 创建fragment的静态方法,方便传递参数
*
* @return
*/
public static <T extends BaseDialog> void open(FragmentManager manager, Class clazz, Bundle args, DialogOptions options) {
try {
T mDialog = null;
try {
mDialog = (T) clazz.newInstance();
mDialog.setOptions(options);
if (args != null) mDialog.setArguments(args);
mDialog.show(manager, mDialog.getClass().getSimpleName());
} catch (java.lang.InstantiationException e) {
e.printStackTrace();
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。



