gpt4 book ai didi

java - ObjectInputStream readObject 导致 RoundingMode.ordinal NullPointerException

转载 作者:搜寻专家 更新时间:2023-11-01 08:19:14 24 4
gpt4 key购买 nike

编辑:这似乎是与 Android Pie (api 28) 有关的问题。似乎适用于以前的版本(在 27、26、25 上测试)。


我在这个 Android 代码上工作了很长时间,我注意到最近当我在磁盘上保存数据时,我收到这个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.math.RoundingMode.ordinal()' on a null object reference

这是我将数据写入磁盘的方式

private void SaveDataToDisk() {
try {
FileOutputStream fos = this.weakActivity.get().openFileOutput(this.FILENAME, Context.MODE_PRIVATE);
if (fos != null) {
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(this.datastore);
os.close();
fos.close();
}
} catch (Exception ex) {
ErrorManager.TrapThrow(ex, this.weakActivity.get());
}
}

this.datastore 是由多个其他对象(数量非常大)组成的复杂对象。

这就是我在需要时读取数据的方式

private void LoadDataFromDisk() {
try {
if (this.weakActivity.get().getFileStreamPath(this.FILENAME).exists()) {
FileInputStream fis = this.weakActivity.get().openFileInput(this.FILENAME);
BufferedInputStream bis = new BufferedInputStream(fis);
ObjectInputStream is = new ObjectInputStream(bis);
try {
this.datastore = (DataStore) is.readObject();
} catch (Exception ex) {
this.datastore = new DataStore();
}
is.close();
fis.close();
}
} catch (Exception ex) {
ErrorManager.TrapThrow(ex, this.weakActivity.get());
}
}

想象一下全新安装的应用程序。第一次 LoadDataFromDisk 什么都不做。稍后,该应用程序会在磁盘上写入一些内容。当应用程序再次调用 LoadDataFromDisk 时,它会正确读取。然后,例如,重新启动应用程序:当达到 LoadDataFromDisk 时,特别是

this.datastore = (DataStore) is.readObject();

我收到上述错误,并回退到一个新的 DataStore 对象,以保持应用程序正常运行。

为什么不总是?读取后数据似乎已损坏。我可以在 AVD 和手机上重现。

感谢任何帮助

最佳答案

我们发现这是由依赖于 java.text.DecimalFormat 的自定义 DataFormatter 对象(在包含的序列化对象中)引起的。当我们去反序列化对象时(有时但不总是,但显然取决于包含对象在 Activity extras 中传递了多少次),包含序列化容器的整个 Extras 集合无效,并且使用 RoundingMode.ordinal() NPE 使应用程序崩溃。

显然 DecimalFormat 类不再适用于 Android 9/Pie 中的序列化,因为在我们的例子中它就像标记包含的 Serializable 对象的实例一样简单DataFormattertransient 并且问题消失了。

很抱歉没有准备好对问题进行更好的剖析,但这解决了我们这个错误的问题。

关于java - ObjectInputStream readObject 导致 RoundingMode.ordinal NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53541154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com