Java 包、类加载器和读取空值

Java 包、类加载器和读取空值,java,android,parcelable,parcel,Java,Android,Parcelable,Parcel,我试图理解如何正确地从包中读取空值。让我们看看我的用例: public class MyModel implements Parcelable { private Long id; private String name; public MyModel() {} public MyModel(Parcel in) { readFromParcel(in); } @Override public int describeCont

我试图理解如何正确地从包中读取空值。让我们看看我的用例:

public class MyModel implements Parcelable {
    private Long id;
    private String name;

    public MyModel() {}

    public MyModel(Parcel in) {
        readFromParcel(in);
    }

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

    @Override public void writeToParcel(Parcel dest, int flags) {
        dest.writeValue(id);
        dest.writeValue(name);
    }

    public void readFromParcel(Parcel in) {
        id = (Long) in.readValue(Long.class.getClassLoader());
        name = (String) in.readValue(String.class.getClassLoader());
    }
}
为了回答这个问题,让我们以字段
name
为例,它是
String
类型

我知道我可以使用
writeString
而不是
writeValue
,但是如果
name
为空,则
writeString
将抛出
NullPointerException

所以现在真正的问题是,如果
name
为null,我尝试
readValue
,然后将null强制转换为
String
将抛出异常

在这种情况下,从地块读取空值的最佳方法是什么? 每次尝试读取包裹时是否需要检查null?但是如果模型中有很多字段,那么这就太多了。 读取时传递
null
ClassLoader
之间有区别吗? 如果读取包裹时值为null,类加载器是否返回空/默认对象

我通常会遇到这样的错误,当它从包裹中读取一个字符串时会发生这种情况:


java.lang.RuntimeException:无法启动活动组件信息{com.company.MyActivity}:java.lang.RuntimeException:包android.os。Parcel@42b82908:在偏移量1368处解组未知类型代码7209045

我认为最好的方法是在
name
之前写入字符串
name
的长度。如果
name
为空,只需将其长度写为0,而不写
name
。读取时,如果读取了
length
,且其值为零,则不要读取
name
,只需将
name
设置为
null

如何为
ClassLoader
提供
MyModel.class。getClassLoader()

在这种情况下,从地块读取空值的最佳方法是什么 案子

可以使用特定于字符串的方法:

  • packet.writeString(字符串)
  • Parcel.readString()
它们可以很好地处理
null
值。


例如,假设您有一个包含以下字段的类:

public class Test implements Parcelable {
    public final int id;
    private final String name;
    public final String description;
    ...
您可以像这样创建
Parcelable
实现(使用Android Studio autoparcelable工具):


您的
Test.name
值将被反序列化为
null
正确,无需对
字符串进行任何转换

示例将有助于改进此答案,但没有理由标记它。如果你不喜欢它,就投反对票。错误地点击了“标志”。这会有什么帮助?解释会有帮助的。谢谢。我写了一门和你一样的课。然后我保留了
name
字段
null
,并将其从ActivityA传递给ActivityB。当我试图在ActivityB中使其脱离原意时,并没有引发异常。发生此类异常还有其他条件吗?writeString(null)将起作用,请参见writeValue的实现方式:它只使用writeString和传递的argument@pskink我看到writeString调用了nativeWriteString,你知道它们在哪里实现吗?为什么你想知道这个?写空字符串完全可以,试着调用writeString(null)它就会工作,顺便说一句:@pskink我只是好奇而已。谢谢。@pskink实际上刚刚确认,如果Long为null,writeLong将抛出NullPointerException。这很有趣,但是如果我的模型中有很多字符串字段,那么我必须对它们中的每一个都执行相同的操作。
@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(id);
    dest.writeString(null); // NOTE the null value here
    dest.writeString(description);
}

protected Test(Parcel in) {
    id = in.readInt();
    name = in.readString();
    description = in.readString();
}