5

安卓代码很简单:

public void createNewTask(View v) {
    try {
        MyTask task = MyTask.class.newInstance();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

private class MyTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        return null;  
    }
}

但是在调用createNewTask方法时,会抛出异常:

Caused by: java.lang.RuntimeException: 
    java.lang.InstantiationException: com.example.MyActivity$MyTask
    at com.example.MyActivity.createNewTask(MyActivity.java:214)
    ... 14 more
    Caused by: java.lang.InstantiationException: com.example.MyActivity$MyTask
    at java.lang.Class.newInstanceImpl(Native Method)
    at java.lang.Class.newInstance(Class.java:1440)
    at com.example.MyActivity.createNewTask(MyActivity.java:211)

但是,如果我选择其他课程,例如

MyActivity task = MyActivity.class.newInstance();

一切都会好起来的。

我的代码哪里出错了?我在带有 android 2.3.6 的 android 手机中对其进行了测试。

4

2 回答 2

2

找到了两种方法来解决这个问题:

public static class MyTask {
}

或者

private static class MyTask {
    public MyTask(){}
}

根据文件

InstantiationException - 如果这个 Class 表示抽象类、接口、数组类、原始类型或 void;或者如果该类没有空构造函数;或者如果实例化由于某种其他原因而失败。

尝试将 nullary 构造函数添加到您的类:

public MyTask() {}

编辑

根据此文档

Class.newInstance() 要求构造函数是可见的;Constructor.newInstance() 在某些情况下可能会调用私有构造函数。

于 2012-10-31T12:35:59.737 回答
0

我想,原因是AsyncTask抽象类,但Activity不是。

而且私人课程不能像你一样被实例化

于 2012-10-31T12:25:23.680 回答