关于java:无法在Android App中实例化类

Cannot instantiate class in Android App

我正在开发一个Android应用程序。在我的应用程序中,我打算去上另一门课。一旦发生这种情况,应用程序就会崩溃。它说它不能实例化我的类。我的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class CustomObject extends Activity{
ArrayList<String> Alerts;
ArrayList<String> Names;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
Intent intent = getIntent();
Names = intent.getExtras().getStringArrayList("Names");
Alerts = intent.getExtras().getStringArrayList("Alerts");
}


public CustomObject(ArrayList<String> prop1, ArrayList<String> prop2) {
    this.Names = prop1;
    this.Alerts = prop2;
}

public ArrayList<String> getProp1() {
    return Names;
}

public ArrayList<String> getProp2() {
   return Alerts;
}
}

这是我的日志:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
10-24 19:56:25.234: E/AndroidRuntime(12982): FATAL EXCEPTION: main
10-24 19:56:25.234: E/AndroidRuntime(12982): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.dev.chicagotraintracker/com.dev.chicagotraintracker.CustomObject}: java.lang.InstantiationException: can't instantiate class com.dev.chicagotraintracker.CustomObject; no empty constructor
10-24 19:56:25.234: E/AndroidRuntime(12982):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2137)
10-24 19:56:25.234: E/AndroidRuntime(12982):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
10-24 19:56:25.234: E/AndroidRuntime(12982):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
10-24 19:56:25.234: E/AndroidRuntime(12982):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
10-24 19:56:25.234: E/AndroidRuntime(12982):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-24 19:56:25.234: E/AndroidRuntime(12982):    at android.os.Looper.loop(Looper.java:137)
10-24 19:56:25.234: E/AndroidRuntime(12982):    at android.app.ActivityThread.main(ActivityThread.java:5103)
10-24 19:56:25.234: E/AndroidRuntime(12982):    at java.lang.reflect.Method.invokeNative(Native Method)
10-24 19:56:25.234: E/AndroidRuntime(12982):    at java.lang.reflect.Method.invoke(Method.java:525)
10-24 19:56:25.234: E/AndroidRuntime(12982):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-24 19:56:25.234: E/AndroidRuntime(12982):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-24 19:56:25.234: E/AndroidRuntime(12982):    at dalvik.system.NativeStart.main(Native Method)
10-24 19:56:25.234: E/AndroidRuntime(12982): Caused by: java.lang.InstantiationException: can'
t instantiate class com.dev.chicagotraintracker.CustomObject; no empty constructor
10-24 19:56:25.234: E/AndroidRuntime(12982):    at java.lang.Class.newInstanceImpl(Native Method)
10-24 19:56:25.234: E/AndroidRuntime(12982):    at java.lang.Class.newInstance(Class.java:1130)
10-24 19:56:25.234: E/AndroidRuntime(12982):    at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
10-24 19:56:25.234: E/AndroidRuntime(12982):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2128)
10-24 19:56:25.234: E/AndroidRuntime(12982):    ... 11 more

我在代码中找不到问题。其他一些问题也提到了一些关于无参数构造函数的内容,但是如何实现它呢?这就是我的问题吗?谢谢你的帮助。


活动和片段可能没有带参数(a.k.a.参数)的构造函数,例如:

1
2
3
4
public CustomObject(ArrayList<String> prop1, ArrayList<String> prop2) {
    this.Names = prop1;
    this.Alerts = prop2;
}

只允许不带参数的构造函数public CustomObject() {(根本不需要指定构造函数)

您必须使用字符串数组在Intent中传递该信息。参见PutExtra和GetStringArrayextra

要从其他活动创建此意图,可以使用

1
2
3
4
Intent intent = new Intent(this, CustomObject.class);
intent.putExtra("prop1", arrayList.toArray(new String[arrayList.size()]));
intent.putExtra("prop2", arrayList2.toArray(new String[arrayList2.size()]));
startActivity(intent);

然后,在活动的onCreate方法中,可以使用以下方法检索值:

1
2
3
Intent intent = getIntent();
List<String> list1 = new ArrayList<String>(Arrays.asList(intent.getStringArrayExtra("prop1")));
List<String> list2 = new ArrayList<String>(Arrays.asList(intent.getStringArrayExtra("prop2")));

因为不可能通过一个简单的意图发送一个List,这里它被转换为一个字符串数组,然后在oncreate方法中返回到一个列表。


活动需要一个非参数构造函数。现在,您添加了一个带有两个参数的构造函数。因此,还应添加一个非构造函数:

1
2
public CustomObject(){
}


继承Activity类或Fragment的类必须具有空构造函数。阅读一下这个。

在您当前的情况下,您可以尝试通过保留这个有争议的构造函数并调用super(),来解决这个问题,注意:这是空的超级类构造函数调用。

我不喜欢这种方法。西蒙通过意图发送的解决方案是正确的方法。