2014-04-04 11 views
57

Używam biblioteki Square's Tape do kolejkowania przesyłania danych na serwer.Wykrywanie EOFException podczas odczytu taśmy QueueFile

Kolejka jest przechowywana w pliku w formacie JSON. Po uruchomieniu aplikacji uruchamiam kolejkę i zaczynam ładować (np. W przypadku Wi-Fi), ale na niektórych urządzeniach na stronie widzę komunikat EOFException z komunikatem 'null' (zaloguj się crashlytics).

Błąd pojawia się podczas tworzenia obiektu FileObjectQueue z istniejącego pliku - z informacji debugujących należy się dowiedzieć, że rzeczywisty plik ma rozmiar ~ 1MB.

Jakieś pomysły, co to powoduje lub jak temu zapobiegać? - może muszę odkurzyć na moim java.io.

Edit: za pomocą taśmy v1.2.1

Caused by: java.io.EOFException 
at java.io.RandomAccessFile.readFully(RandomAccessFile.java:419) 
at java.io.RandomAccessFile.readInt(RandomAccessFile.java:439) 
at com.squareup.tape.QueueFile.readElement(:182) 
at com.squareup.tape.QueueFile.readHeader(:162) 
at com.squareup.tape.QueueFile.(:110) 
at com.squareup.tape.FileObjectQueue.(:35) 
at com.myapp.queue.MyUploadTaskQueue.create(:125) 

Updated - Także widząc ten błąd ponieważ uaktualnieniu do 1.2.2

Caused by: java.io.IOException: File is corrupt; length stored in header is 0. 
     at com.squareup.tape.QueueFile.readHeader(:165) 
     at com.squareup.tape.QueueFile.<init>(:117) 
     at com.squareup.tape.FileObjectQueue.<init>(:35) 
+0

Jakiej wersji biblioteki używasz? –

+0

Hej Jake, używając Tape v1.2.1 (zaktualizowany w pytaniu), ale po prostu sprawdzając dziennik zmian widzę być może poprawioną "Zapobiegaj uszkodzeniom podczas rozszerzania idealnie nasyconej kolejki", więc spróbuję 1.2.2. thx – scottyab

+0

Cool. Właśnie dlatego poprosiłem! –

Odpowiedz

1

EOFException pokazuje, że koniec pliku został osiągnięty, to znaczy, nie ma więcej bajtów do przeczytania. Ten wyjątek jest tylko innym sposobem sygnalizowania, że ​​nie ma już nic do czytania, podczas gdy inne metody zwracają wartość, jak -1. Jak widać w twoim śladzie stosu błędów, metody wyrzucające wyjątek są czytanymi metodami; java.io.RandomAccessFile.readFully(RandomAccessFile.java:419) i com.squareup.tape.QueueFile.readHeader(:165). Jako takie, nie można go "powstrzymać", chyba że nie czytasz wszystkich bajtów (które zazwyczaj chcesz), po prostu złap go tak; catch(EOFException e) { /* ignore */ } :) https://docs.oracle.com/javase/7/docs/api/java/io/EOFException.html

+0

Ogólnie tak, ale API Square'a stwierdza, że ​​jeśli kolejka jest pusta, metoda peek zwróci wartość null i nie wyrzuci wyjątku. Możemy oczekiwać, że biblioteka będzie obsługiwać wyjątek EOF wewnętrznie. Nie sądzę, że wyjątek EOF jest tutaj normalny. – Mikhail

Powiązane problemy