2016-12-08 6 views
0

私が作っているゲームに最高得点クラスを書き込もうとしているので、スコアとスコアの値をスコアクラスに書いて、HighScoreクラスをチェックインしますそれが高い得点にある場合。 しかし、私はserialziationで簡単な問題を抱えていますが、私はエラーが何であるか分かりません。これは、コードされていますJavaシリアル化のEOF例外

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Iterator; 

public class HighScore<T extends Serializable & Comparable<T>> implements 
     Serializable, Iterable<T> { 

    private int size = 3; 
    private ArrayList<T> list; 
    private static final String HS_FILE = "resources/High_Scores.txt"; 
    ObjectOutputStream oos = null; 
    ObjectInputStream ois = null; 
    public String name; 

    public HighScore(int size) { 
     this.size = size; 
     list = new ArrayList<>(size); 
    } 

    public boolean add(T val) throws IOException, ClassNotFoundException { 

     readFile(); 
     boolean addWorks = list.size() < size || list.get(list.size() 
       - 1).compareTo(val) < 0; 
     if (addWorks) { 
      list.add(val); 
      Collections.sort(list, Collections.reverseOrder()); 
      if (list.size() > size) { 
       list.remove(size); 
      } 
      updateFile(); 
      int i = 1; 
      for (Iterator<T> it = list.iterator(); it.hasNext();) { 
       Score n = (Score) it.next(); 
       System.out.println(i + ": " + n.name + ", " + n.score + " points "); 
       i++; 
      } 
     } 
     return addWorks; 
    } 

    private void readFile() throws IOException, ClassNotFoundException { 
     ois = new ObjectInputStream(new FileInputStream(HS_FILE)); 
     list = (ArrayList<T>) ois.readObject(); 
    } 

    private void updateFile() throws FileNotFoundException, IOException { 
     oos = new ObjectOutputStream(new FileOutputStream(HS_FILE)); 
     oos.writeObject(list); 
    } 

    @Override 
    public Iterator<T> iterator() { 
     return list.iterator(); 
    } 
} 

次のようにスコアクラスは次のとおりです。

import java.io.Serializable; 

public class Score implements Serializable, Comparable<Score> { 

String name; 
int score; 

public Score(String name, int score) { 
    this.name = name; 
    this.score = score; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public int getScore() { 
    return score; 
} 

public void setScore(int score) { 
    this.score = score; 
} 

@Override 
public String toString() { 
    return "Score{" + "name=" + name + ", score=" + score + '}'; 
} 

@Override 
public int compareTo(Score that) { 
    return this.score - that.score; 
} 

} 

エラー出力が示すには、次のとおりです。

Dec 07, 2016 9:22:01 PM 
brachabee2.entities.Player gameOver 
SEVERE: null 
java.io.EOFException 

すべてのヘルプは素晴らしいことです!ありがとう!

+0

あなたは**使用後**ストリームを閉じるべきですか?そのため、これらの一時ストリームへの参照をインスタンスフィールドに格納しないでください。したがって、最も使いやすいのは、[try-with-resourcesステートメント](https://docs.oracle.com/javase/8/docs/technotes/guides/language/try-with-resources.html)です。 – Holger

答えて

0

スコアをシリアル化/デシリアライズしようとしていると思いますか? Serializableを実装しているかどうかチェックできますか?あなたはスコアのコードを通過することができます

+0

さて、私はコードを編集し、スコア、任意のアイデアを追加しましたか? – Jonathan

+0

「resources/High_Scores.txt」は存在しますか?まだ存在しないときにファイルを読み込もうとしている可能性があります –

関連する問題