我目前有一些在声明中初始化的字段的类,如下所示:
public class SomeClass implements Externalizable {
private long id;
private final List<Hit> hits = new ArrayList<>();
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeLong(id);
out.writeInt(hits.size());
for (int i = 0; i < hits.size(); i++) {
out.writeObject(hits.get(i));
}
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
id = in.readLong();
int size = in.readInt();
for (int i = 0; i < size; i++) {
hits.add((Hit) in.readObject()); //<--Nullpointer here, hits == null
}
}
}
并且此类用于基于文件的chronicle-map
配置,如下所示:
ChronicleMap<Long, SomeClass> storage = ChronicleMapBuilder
.of(Long.class, SomeClass.class)
.averageValueSize(avgEntrySize)
.entries(entries)
.createPersistedTo(new File(path));
问题是,当我重新启动我的应用程序时,我会NullpointerException
在编年史尝试读取保存的地图时得到,因为hits
字段没有初始化,这意味着它是null
.
我做了一些调查,发现在调用chronical之前使用(in )readExternal
创建了这个类的对象:UNSAFE.allocateInstance
ExternalizableMarshaller
protected E getInstance() throws Exception {
return (E) NativeBytes.UNSAFE.allocateInstance(classMarshaled);
}
所以基本上这就是它没有初始化的原因。我想了解为什么它使用这种方法而不是MethodHandle
反射?
也许还有另一种方法可以在不修改的情况下解决这个问题SomeClass
,比如一些编年史配置属性?