ObjectInputStreamのreadObjectメソッドはRoundingMode.ordinalにNullPointerExceptionが発生します

ヴァレリオ:

EDIT:それはAndroidのパイ(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();

私は上記のエラーが表示され、アプリの動作を維持するために、バック新しいデータストアオブジェクトに落ちます。

なぜ常にではありませんか?読み込まれた後のデータが破損しているようです。私はAVD上で、私の携帯電話に再現することができます。

すべてのヘルプは大歓迎します

Echoloc8:

私たちは、これは、カスタムによって引き起こされたことがわかっDataFormatterに依存している(含む、シリアライズされたオブジェクト内の)オブジェクトjava.text.DecimalFormat我々は(時にはいつもではないが、しかし含むオブジェクトが間に渡された回数に明らかに依存オブジェクトをデシリアライズするために行ったときActivityエクストラ)、連載の容器を含む全体エクストラコレクションが無効だった、としてアプリをクラッシュしたRoundingMode.ordinal()NPE。

どうやらDecimalFormat我々の場合には、それが含む、マーキングなどの単純なようだったので、このクラスは、もはや、アンドロイド9 /パイでシリアライズとよく果たしていないSerializableのオブジェクトのインスタンスDataFormatterとしてはtransient、問題が消えました。

申し訳ありませんが、問題のより良い解剖の準備ができていますが、これは、このエラーで私たちの問題を解決しません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=201793&siteId=1