java - 调用 Bundle.getParcelable 时收到 NullPointerException

标签 java android android-intent bundle parcelable

我有一个问题,我试图解决几个小时但无法解决,我需要一些帮助。我试图从登录 Activity 中检索 URL 字符串,并尝试使用 Parcelable 对象将其传递到主 Activity ,但我在 getParcelable 方法上收到 NullPointerException。

以下代码创建 URL 可分割对象并将其放入 Intent 并调用 Main Activity

 public void onGetPremiumURLCompletion(List<String> urls){
    String[] urlList = new String[urls.size()];
    for (int i = 0; i < urls.size(); i++) {urlList[i] = urls.get(i);}
    URL urlParcelable = new URL(urlList);
    for (int i = 0; i < urlParcelable.getUrls().length; i++) {Log.w("url from parcelable",urlParcelable.getUrls()[i]);}
    Intent intent = new Intent(this,Home.class);
    intent.putExtra("PremiumURLList",urlParcelable);
    progress.dismiss();
    startActivity(intent);

}

下面是 URL 可打包类

public class URL implements Parcelable {
private String[] urls;

public static final Parcelable.Creator<URL> CREATOR = new Parcelable.Creator<URL>() {
    public URL createFromParcel(Parcel in) {
        return new URL(in);
    }

    public URL[] newArray(int size) {
        return new URL[size];
    }
};

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeStringArray(urls);
}

private URL(Parcel in) {
    in.readStringArray(urls);
}

public URL(String[] urlList){
    urls = urlList;
}

public String[] getUrls() {
    return urls;
}}

以下是我从 Intent 接收可分割对象的方式。

Bundle b = getIntent().getExtras();
    URL urlList = b.getParcelable("PremiumURLList");

我在 getParcelable 行上收到以下错误

Caused by: java.lang.NullPointerException
        at android.os.Parcel.readStringArray(Parcel.java:962)
        at com.rayat.pricewiz.entity.URL.<init>(URL.java:33)
        at com.rayat.pricewiz.entity.URL.<init>(URL.java:9)
        at com.rayat.pricewiz.entity.URL$1.createFromParcel(URL.java:14)
        at com.rayat.pricewiz.entity.URL$1.createFromParcel(URL.java:12)
        at android.os.Parcel.readParcelable(Parcel.java:2104)
        at android.os.Parcel.readValue(Parcel.java:2013)
        at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
        at android.os.Bundle.unparcel(Bundle.java:249)
        at android.os.Bundle.getParcelable(Bundle.java:1206)
        at com.rayat.pricewiz.view.activity.tabhome.Home.onCreate(Home.java:72)
        at android.app.Activity.performCreate(Activity.java:5426)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)

请帮忙。

谢谢

最佳答案

您的问题在这里:

private URL(Parcel in) {
    in.readStringArray(urls);
}
此时

urls 为 null,而 readStringArray(String[]) 方法需要一个非 null 参数,且长度与读取结果的长度相同大批。我发现该方法几乎毫无用处,因为除非您事先知道数组的固定大小,否则它实际上不起作用。或者,我建议您使用createStringArray():

private URL(Parcel in) {
    urls = in.createStringArray();
}

关于java - 调用 Bundle.getParcelable 时收到 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25465165/

相关文章:

java - 获取枚举 .values()[] 或创建枚举数组?

Android GPS ACCURACY_HIGH 导致强制关闭?

java - 来自扩展 TimerTask 的类中的 IntentService

android - 将带有 getLaunchIntentForPackage() 返回的 Intent 的额外内容发送到另一个应用程序的主要 Activity

android - 清除返回堆栈但保留过渡动画

java - 使用 Java 字符串格式格式化整数

java - 如果我不同步方法,后台发生了什么导致应用程序运行而控制台不打印任何内容?

java - 有效地使用 Netty 管道

android - 为什么更新android gradle后出现错误?

Android - 在我的应用程序中获取电子邮件附件名称