使用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();
    }
}

 

发表回复

后才能评论