2013-04-21 122 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); 
} 

我不明白爲什麼會出現這種情況。它的一次對象保存和閱讀。沒有涉及到達到文件結尾的循環。爲什麼會產生? 任何幫助表示讚賞........感謝

編輯:這是怎麼了我的儲蓄

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 2013-04-21 14:18:18

+0

你是什麼意思添加任何字段? StatDetails是一個有15個成員變量(字段)的類 – Snake 2013-04-21 14:22:58

+1

當你寫入文件時,你是否總是關閉你的流?這可能是問題的根源。 – Keppil 2013-04-21 14:25:57

回答

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秒後我調用上面的代碼打開文件並重新寫入並關閉。我不認爲我需要writeInt嗎? – Snake 2013-04-21 22:43:45

+0

@Snake所以你也可以調用'flush()'。不,如果你只想寫一個對象,你不需要調用'writeInt()'。 – Sajmon 2013-04-21 22:45:41

+0

其實看着你上面的代碼,我沒有看到背後的循環點!只有一個對象被寫入,它應該被讀取一次 – Snake 2013-04-21 23:37:37

0

EOFException意味着你正在試圖讀到文件的結尾。可能的原因可能是:

  1. 寫入文件時出現問題,或文件本身可能損壞。
  2. 它可以是零長度的文件,不應該是零長度。
  3. 您可能正在讀取除寫入內容之外的文件。

我的建議是,檢查is.available()並嘗試閱讀該對象。

+0

查看我的編輯上面的更新。爲什麼我會遇到上面的任何錯誤?調試建議? – Snake 2013-04-21 22:14:45

相關問題