android代码很简单:
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安卓手机上测试过它。
答案 0 :(得分:2)
找到两种方法来解决这个问题:
public static class MyTask {
}
或
private static class MyTask {
public MyTask(){}
}
InstantiationException - 如果此Class表示抽象类, 接口,数组类,基本类型或void;或者如果 class没有nullary构造函数;或者如果实例化失败了 其他一些原因。
尝试在您的班级中添加无效构造函数:
public MyTask() {}
修改强>
Class.newInstance()要求构造函数可见; Constructor.newInstance()可以调用私有构造函数 某些情况。
答案 1 :(得分:0)
我想,原因是AsyncTask
是抽象类,但Activity
不是。
私有类不能像你一样实例化