使用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(); } }
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。