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