【问题标题】:Android Parcelable readStringArray bad array lengths [closed]Android Parcelable readStringArray 错误的数组长度 [关闭]
【发布时间】:2014-07-07 09:42:50
【问题描述】:

你能告诉我如何解决这个问题吗?它抛出了一个错误的数组长度异常,经过调试,我发现这个方法抛出了异常:

--------------------------My Code-----------------------------------

public class SingleModels implements Parcelable{

    public String name;
    public String[] names ;

    @Override
    public int describeContents() {

        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {

        dest.writeString(name);
        dest.writeStringArray(names);
    }
    public static final Parcelable.Creator<SingleModels> CREATOR = new Creator<SingleModels>() {

        @Override
        public SingleModels[] newArray(int size) {
            return new SingleModels[size];
        }

        @Override
        public SingleModels createFromParcel(Parcel source) {
            SingleModels models = new SingleModels();
            models.name = source.readString();
            models.names = source.createStringArray();
            source.readStringArray(models.names);
            return models;}
    };
}

这是我的例外,但是这么久了,我不能上传图片,我把信息按重要切了:

07-07 09:52:59.319: E/AndroidRuntime(4296): FATAL EXCEPTION: main
07-07 09:52:59.319: E/AndroidRuntime(4296): java.lang.RuntimeException: Unable to start activity ComponentInfo{edu.single.parcelable.example/edu.single.parcelable.example.ArrayParcelable_Activity}: java.lang.RuntimeException: bad array lengths
07-07 09:52:59.319: E/AndroidRuntime(4296):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)

【问题讨论】:

  • 请发布您的 logcat 错误。

标签: android arrays parcelable


【解决方案1】:

这是readStringArray()的实现:

public final void readStringArray(String[] val) {
    int N = readInt();
    if (N == val.length) {
        for (int i=0; i<N; i++) {
            val[i] = readString();
        }
    } else {
        throw new RuntimeException("bad array lengths");
    }
}

因此,您的 models.names 数组的长度似乎是引发该错误的原因。您需要事先知道数组的确切大小才能创建数组,以免引发错误。

我认为createStringArray() 就足够了,你不需要调用source.readStringArray(models.names); 所以只需删除它,它应该可以工作。


我认为这里可能存在语言障碍,所以我会提及您应该拥有的确切代码:

@Override
    public SingleModels createFromParcel(Parcel source) {
        SingleModels models = new SingleModels();
        models.name = source.readString();
        models.names = source.createStringArray();
        return models;
}

【讨论】:

  • public SingleModels createFromParcel(Parcel source) { SingleModels models = new SingleModels(); models.name = source.readString(); models.names = 新字符串[7]; source.readStringArray(models.names);返回模型; } 和我设置的 StringArray 长度是确定的
  • 首先,尝试简单地删除你readStringArray所在的行,我认为你根本不需要它。
  • 我最后创建了createStringArray(),并调用了readInt(),readInt() is Not Equal Array legth
  • 你为什么打电话给readInt?您所要做的就是删除readStringArray,您的代码应该可以工作了。
  • 没错!!!谢谢你回答我的问题!
猜你喜欢
  • 2017-09-07
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 2013-01-26
  • 2011-03-17
  • 2021-12-04
相关资源
最近更新 更多