【问题标题】:Cannot instantiate class in Android App无法在 Android App 中实例化类
【发布时间】:2013-10-25 08:12:49
【问题描述】:

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

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;
}
}

这是我的 LogCat:

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

我在我的代码中找不到问题。其他一些问题已经说明了无参数构造函数,但我该如何实现呢?这还是我的问题吗?感谢您的帮助。

【问题讨论】:

  • 没有no-argument constructor 完全是您的问题。你读过你的logcat,还是只是C&P在这里让我们为你读? Caused by: java.lang.InstantiationException: can't instantiate class com.dev.chicagotraintracker.CustomObject; no empty constructor
  • 我看到了它所说的,我只是不明白什么是无参数构造函数以及我的代码的确切问题是什么。

标签: java android


【解决方案1】:

Activity 和 Fragments 可能没有具有带参数(也称为参数)的构造函数,例如:

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

只允许使用不带参数的构造函数public CustomObject() {(完全不需要指定构造函数)

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

要从另一个 Activity 创建此意图,您可以使用

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);

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

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,所以这里将其转换为 String 数组,然后在 onCreate 方法中转回 List。

【讨论】:

  • 我将如何创建该意图?课程是什么?
  • 有没有办法将该 ArrayList 传递给另一个没有 Intent 的类?我不希望它显示我上面的类,我只想将数据从 UI 类传递给该类,然后将其传递给另一个,然后将其传递回 UI 类。
  • @hichris123 可以通过Application 对象“传递”(或者更确切地说存储)任何对象,read here 以获取更多信息
【解决方案2】:

继承Activity 类或Fragment 的类必须有空的构造函数。对此进行一些阅读。

在您当前的情况下,您可能会尝试通过保留此参数构造函数并调用super() 来解决它,注意:这是空的超类构造函数调用。

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

【讨论】:

  • super() 的调用由Java 隐式插入。这不会改变任何事情。
【解决方案3】:

Activity 需要一个非参数构造函数。现在,你添加了一个带有两个参数的构造函数。所以,你还应该添加一个非构造函数:

public CustomObject(){
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多