2016-03-14 25 views
0

对不起,如果这是一个简单的问题,但我是新手在Java编程和无法处理与Java保存文件Bug的一个问题..问题是,有时它保存并加载值没有错误,有时它显示我错误,仍然加载。但有时savefile不会工作。Java保存文件错误

错误,我得到:

java.io.EOFException 
at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source) 
at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source) 
at java.io.ObjectInputStream.readStreamHeader(Unknown Source) 
at java.io.ObjectInputStream.<init>(Unknown Source) 
at Clicker.ClickerGame.LoadFile(ClickerGame.java:2479) 
at Clicker.mainClass.main(mainClass.java:27) 

我的主要(入门级):

package Clicker; 

import javax.swing.JFrame; 

public class mainClass { 

    public static void main(String[] args) { 

      ClickerGame CG = new ClickerGame(); 

      JFrame frame = new JFrame("CarCollectionarV1"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      CG.addComponentToPane(frame.getContentPane()); 

      frame.pack(); 
      frame.setVisible(true); 
      frame.setResizable(true); 
      frame.setSize(1000, 700); 

      CG.LoadFile(); 

      boolean GameLoop = true; 
      while(GameLoop){ 
      CG.refresh(); 
      CG.SaveFile(); 
      }   

    } 
} 

ClickerGame类(在哪里SAVEFILE和的LoadFile功能):

public void SaveFile(){ 
     try{ 
      File SaveFile = new File("SaveFile.sav"); 
      if(!SaveFile.exists()) { 
       SaveFile.createNewFile(); 
      } 
      FileOutputStream saveFileSub = new FileOutputStream(SaveFile); 
      ObjectOutputStream save = new ObjectOutputStream(saveFileSub); 

      save.writeObject(CarMain.main); 
      save.writeObject(Box.boxes); 
      save.writeObject(CarFrame.frames); 
      save.writeObject(Part.parts); 
      save.writeObject(CarsLv1.cars); 
      save.writeObject(CarsLv2.cars); 
      save.writeObject(CarsLv3.cars); 
      save.writeObject(CarsLv4.cars); 
      save.writeObject(CarsLv5.cars); 
      save.writeObject(CarsLv6.cars); 
      save.writeObject(CarsLv7.cars); 
      save.writeObject(CarsLv8.cars); 
      save.writeObject(CarsLv9.cars); 
      save.writeObject(CarsLv10.cars); 

      save.close(); 
      } 
      catch(Exception exc){ 
      exc.printStackTrace(); 
      } 
    } 

    public void LoadFile(){ 
    try{ 
     File SaveFile = new File("SaveFile.sav"); 
     if(!SaveFile.exists()) { 
      SaveFile.createNewFile(); 
     } 
     FileInputStream SaveFileSub = new FileInputStream(SaveFile); 
     ObjectInputStream load = new ObjectInputStream(SaveFileSub); 

     CarMain.main = (Integer[]) load.readObject(); 
     Box.boxes = (Integer[]) load.readObject(); 
     CarFrame.frames = (Integer[]) load.readObject(); 
     Part.parts = (Integer[]) load.readObject(); 
     CarsLv1.cars = (String[]) load.readObject(); 
     CarsLv2.cars = (String[]) load.readObject(); 
     CarsLv3.cars = (String[]) load.readObject(); 
     CarsLv4.cars = (String[]) load.readObject(); 
     CarsLv5.cars = (String[]) load.readObject(); 
     CarsLv6.cars = (String[]) load.readObject(); 
     CarsLv7.cars = (String[]) load.readObject(); 
     CarsLv8.cars = (String[]) load.readObject(); 
     CarsLv9.cars = (String[]) load.readObject(); 
     CarsLv10.cars = (String[]) load.readObject(); 

     load.close(); 
     } 
     catch(Exception exc){ 
     exc.printStackTrace(); 
     } 
     } 
+0

关于代码质量的备注:似乎您已经了解了数组的概念......如果是这样:那么将其应用于您的“CarLvxx”字段。给定变量名称.1,.2,...然后有明确的代码来处理它们就是超级糟糕的,不应该这样做。此外:不要在名称中缩写。输入时保存几个字符没有意义;因为它使得每次必须阅读源代码变得更加困难。 – GhostCat

回答

2

您的loadFile方法读取的不仅仅是文件内容。这是一个EOFException(文件结束异常)。

在你的IDE,在这里你可以看到行号,您就可以在什么时候你overread确切地告诉:这是行2479在ClickerGame类(看到错误的堆栈跟踪)

如果我猜测,您在保存文件之前加载了文件:因为如果文件不存在,您的加载文件会创建该文件,您将创建一个空文件,然后尝试读取该文件的内容。

+0

是的,我第一次加载,savefile(我的想法是:第一次,应用程序启动时,它创建新文件,但如果文件存在,它加载对象)。我知道它是什么线,但我无法弄清楚。当我写这个问题时,我有这个错误。我冒烟,没有改变任何代码,现在它再次运作。 5次启动应用程序,所有时间全部加载。 3分钟后再次尝试,并再次错误。为什么? – crelix

+0

要从文件中读取,文件中必须有东西。当你创建文件时,它是空的。如果您尝试从空文件读取(或从无法读取的位置读取),则会出现此错误。如果你想这个工作,不要在加载方法中创建文件。做“if(fileExists){read;}​​”。你现在拥有的是“if(!fileExists){create}不管什么都读”; –