2013-04-21 2 views
0

У меня есть игра, которая регулярно сохраняет текущий статус игры в файл (путем записи сериализованного объекта в файл). Пользователь может продолжить игру позже, и он будет читать этот объект и строить игру оттуда.Исключение, сгенерированное для is.readObject. Зачем?

Это, кажется, работает нормально, но иногда я получаю это исключение

java.io.EOFException 
     at java.io.DataInputStream.readByte(DataInputStream.java:98) 
     at java.io.ObjectInputStream.nextTC(ObjectInputStream.java:506) 
     at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:778) 
     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003) 
     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) 
     at com.myGame.GameState.loadFromFile 
     at com.myGame.GameState.loadGame 

А вот код LoadFromFile

  try { 
    FileInputStream fis = mActivity.openFileInput(fileName); 
    ObjectInputStream is = new ObjectInputStream(fis); 
    stateDetails = (StateDetails)is.readObject();//exception is generated here 

    is.close(); 
    fis.close(); 
} catch (Exception e) { 
    MyApplication.SWERR(e); 
} 

Я не понимаю, почему это произошло. Его одноразовый объект экономит и читает. Для достижения конца файла не требуется никаких циклов. Почему он будет создан? Любая помощь приветствуется ........ спасибо

Edit: это, как я спасительная

FileOutputStream fos = mActivity.openFileOutput(fileName, Context.MODE_PRIVATE); 
      ObjectOutputStream os = new ObjectOutputStream(fos); 
      os.writeObject(stateDetails); 
      os.flush(); 
      fos.flush(); 
      os.close(); 
      fos.close(); 
+0

вы добавил поля StateDetails или любой из переменных считываются в ? – ddmps

+0

Что вы подразумеваете под добавлением каких-либо полей? StatDetails - это класс с 15 переменными-членами (поля) – Snake

+1

Вы всегда закрываете свой поток при записи в файл? Это может быть источником проблемы. – Keppil

ответ

0

Это, кажется, работает нормально, но иногда я получаю это исключение

Попробуйте использовать этот подход:

try { 
    FileInputStream fis = mActivity.openFileInput(fileName); 
    ObjectInputStream is = new ObjectInputStream(fis); 
    while(true) { 
     try { 
     stateDetails = (StateDetails) is.readObject(); 
     } 
     catch(EOFException ex) { 
      is.close(); 
      break;  
     } 
    } 
} 
catch (Exception e) { 
    MyApplication.SWERR(e); 
} 

Я была аналогичная проблема, и я решил ее код выше. Но всегда нужно убедиться, что:

  • не называют readObject() дважды
  • близко всегда ObjectOutputStream сразу после того, как запись осуществляется
  • если вы пишете больше объектов, сначала вы должны написать их количество через writeInt(<value>), а затем перед чтением вызова getInt() и читать объекты в цикле
+0

Привет, Спасибо за ответ. Итак, для второй точки, вы имеете в виду, что мне не нужно делать флеш? (Просто близко сразу). Я не пишу больше одного объекта, но то, что я делаю, это то, что через каждые 10 секунд я вызываю код выше, который открывает файл и перезаписывает его и закрывает. Я не думаю, что мне нужно написать для этого, а? – Snake

+0

@Snake, чтобы вы могли также вызвать 'flush()'. и нет, если вы хотите написать только один объект, вам не нужно вызывать 'writeInt()'. – Sajmon

+0

На самом деле, глядя на код, который у вас был выше, я не вижу, чтобы точка зациклилась! Существует только один объект, который должен быть прочитан один раз – Snake

0

EOFException означает, что вы пытаетесь читать после конца файла. Возможными причинами могут быть:

  1. Проблема при записи файла или возможном повреждении самого файла.
  2. Это может быть файл с нулевой длиной, который не должен быть нулевой длины.
  3. Возможно, вы читали файл, за исключением того, что было написано.

Мое предложение было бы, поместите чек на is.available() и попробуйте прочитать объект.

+0

Проверьте мое изменение выше для обновления. Зачем мне удаваться какие-либо из вышеперечисленных ошибок? Предложение для отладки? – Snake

Смежные вопросы