2012-02-26 57 views
-1

所以我目前正在制作一个游戏(一个超过3500行代码的巨大游戏),并且在编写游戏的保存功能时,我碰到了一个error.it保存得很好,但是当我尝试负载,我保存的游戏它的一个文件返回一个错误:java游戏保存程序不会工作

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "" 
    at java.lang.NumberFormatException.forInputString(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at com.torstein.Mars_Settlement.States.Building.Parse(Building.java:56) 
    at com.torstein.Mars_Settlement.Managers.SavingManager.Load(SavingManager.java:102) 
    at com.torstein.Mars_Settlement.SLGUI$2.actionPerformed(SLGUI.java:155) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 

等等...

它basicly说,我用它来扫描该文件的扫描仪将返回“” 。我已经检查了多次源代码,但我无法让我工作。这里是SavingManager类:

0 
R:4:4:0:false 
: 
false 
false 
1000 
1000 
500 
1000 
false 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
2 
0 
0 
0 
0 
1 
0 
0 
2 
0 
3 
0 
0 
0 
0 
0 
0 
1 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
2 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
1 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
2 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
2 
0 
0 
1 
0 
3 
0 
2 
0 
2 
0 
0 
0 
0 
0 
0 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
0:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
-1:100:0:1 
false 
: 
: 
: 
: 
: 
: 

Building.Parse:

public static Building Parse(String parsef){ 

     int id = Integer.parseInt(parsef.split(":")[0]); 
     Building b =id == -1 ? No : 
     id == 0 ? Base : 
     id == 1 ? UranCollectorBase : 
     id == 2 ? IceCollectorBase : 
     id == 3 ? NuclearReactor : 
     id == 4 ? House : 
     id == 5 ? IceMeltor : 
     id == 6 ? GunHouse : 
     id == 7 ? ResearchCenter : 
     id == 8 ? GBase : 
     id == 9 ? SBase : 
     id == 10 ? MBase : 
     id == 11 ? FlowerCollector : 
     id == 12 ? WindMill : 
     id == 13 ? VechleProduser : 
     id == 14 ? OBase : 
     No; 
     b.health = Integer.parseInt(parsef.split(":")[1]); 
     b.Tanks = Integer.parseInt(parsef.split(":")[2]); 
     b.lookfor=carStates.Parse(Integer.parseInt(parsef.split(":")[3])); 
     return b; 
    } 

如果有别的,你将不得不需要,即时通讯试图解析

package com.torstein.Mars_Settlement.Managers; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Formatter; 
import java.util.Scanner; 

import com.torstein.Mars_Settlement.Bases; 
import com.torstein.Mars_Settlement.Connection; 
import com.torstein.Mars_Settlement.Main; 
import com.torstein.Mars_Settlement.Eneties.CarEnety; 
import com.torstein.Mars_Settlement.Eneties.LightGunnerEntity; 
import com.torstein.Mars_Settlement.Eneties.Pepole; 
import com.torstein.Mars_Settlement.Eneties.Plant; 
import com.torstein.Mars_Settlement.Eneties.TankEntity; 
import com.torstein.Mars_Settlement.States.Building; 
import com.torstein.Mars_Settlement.States.GroundState; 

public class SavingManager { 

    public static void Save(String Path){ 
     Main m = Main.UseThis; 
     File txt = new File(Path); 
     txt.delete(); 
     Formatter f = null; 
     try { 
      f = new Formatter(Path); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
     f.format("%d%n",m.pepoleOut); 
     for(Bases b : m.bases) 
      f.format(b.toString()+"%n"); 
     f.format(":%n"); 
     f.format(m.Fusion+"%n"); 
     f.format(m.Compact+"%n"); 
     f.format(m.Money+"%n"); 
     f.format(m.Water+"%n"); 
     f.format(m.Energy+"%n"); 
     f.format(m.Food+"%n"); 
     f.format(m.Venus+"%n"); 
     for(int x = 0;x<20;x++) 
      for(int y = 0;y<20;y++) 
       f.format(m.stateG[x][y].T+"%n"); 
     for(int x = 0;x<20;x++) 
      for(int y = 0;y<20;y++) 
       f.format(m.stateB[x][y].toString()+"%n"); 
     f.format(m.Terraformed+"%n"); 

     for(CarEnety b : m.cars) 
      f.format(b.toString()+"%n"); 
     f.format(":%n"); 

     for(Pepole b : m.Pepole) 
      f.format(b.toString()+"%n"); 
     f.format(":%n"); 

     for(Plant b : m.plants) 
      f.format(b.toString()+"%n"); 
     f.format(":%n"); 

     for(Connection b : m.Connections) 
      f.format(b.toString()+"%n"); 
     f.format(":%n"); 
     for(TankEntity b : m.Tanks) 
      f.format(b.toString()+"%n"); 
     f.format(":%n"); 
     for(LightGunnerEntity b : m.LightGunners) 
      f.format(b.toString()+"%n"); 
     f.format(":%n"); 

     f.close(); 
    } 
    public static void Load(String Path){ 
     final Main m = Main.UseThis; 
     m.Contiuecapable=true; 
     m.Treset(); 
     Scanner scan = null; 
     try { 
      scan = new Scanner(new File(Path)); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
     String cln; 
     m.pepoleOut = scan.nextInt(); 
     while(!(cln = scan.nextLine()).startsWith(":")) 
      if(Bases.parseBase(cln)!=null)m.bases.add(Bases.parseBase(cln)); 
     m.Fusion = scan.nextBoolean(); 
     m.Compact = scan.nextBoolean(); 
     m.Money = scan.nextInt(); 
     m.Water = scan.nextInt(); 
     m.Energy = scan.nextInt(); 
     m.Food = scan.nextInt(); 
     m.Venus = scan.nextBoolean(); 
     for(int x = 0;x<20;x++) 
      for(int y = 0;y<20;y++) 
       m.stateG[x][y]=GroundState.Parse(scan.nextInt()); 


     for(int x = 0;x<20;x++) 
      for(int y = 0;y<20;y++) 
      { 

       m.stateB[x][y]= Building.Parse(scan.nextLine()); 
       if(m.stateB[x][y].index==6) 
        m.addHouseSpirit(x,y); 
      } 

     m.Terraformed = scan.nextBoolean(); 
     while(!(cln = scan.nextLine()).startsWith(":")) 
      if(CarEnety.Parse(cln)!=null)m.cars.add(CarEnety.Parse(cln)); 
     while(!(cln = scan.nextLine()).startsWith(":")) 
      if(Pepole.Parse(cln)!=null)m.Pepole.add(Pepole.Parse(cln)); 
     while(!(cln = scan.nextLine()).startsWith(":")) 
      if(Plant.Parse(cln)!=null)m.plants.add(Plant.Parse(cln)); 
     while(!(cln = scan.nextLine()).startsWith(":")) 
      if(Connection.Parse(cln)!=null)m.Connections.add(Connection.Parse(cln)); 
     while(!(cln = scan.nextLine()).startsWith(":")) 
      if(TankEntity.Parse(cln)!=null)m.Tanks.add(TankEntity.Parse(cln)); 
     while(!(cln = scan.nextLine()).startsWith(":")) 
      if(LightGunnerEntity.Parse(cln)!=null)m.LightGunners.add(LightGunnerEntity.Parse(cln)); 

     scan.close(); 
    } 

} 

文件内容修复这个错误,请说清楚。谢谢你的时间。托尔斯泰。

+2

当你在调试器中运行它时,你学到了什么? – 2012-02-26 15:22:06

+0

扫描仪在错误发生之前仍然有输入,它停留在循环的非常重要的元素上,这基本上是我注意到的所有重要的东西 – 2012-02-26 15:24:27

+4

好的。我认为如果你想在这里获得有用的帮助,你需要将其减少到一个最小的测试用例,它可以显示出问题(参见http://sscce.org)。 – 2012-02-26 15:26:05

回答

0

我认为,当上次执行for循环{GroundState.Parse(scan.nextInt())}语句scan.nextInt()时,文件读指针位于行尾。然后调用nextLine()将返回“”(空字符串)。所以你需要做的只是从处理中跳过这个特殊的空字符串。

3

不要打扰编写自己的对象持久代码 - 现有解决方案。对于您的数据,我建议您将游戏的状态作为对象存储。使用JAXB编组对象(即以XML格式写入磁盘)并解组对象(即通过读取XML文件来创建对象)。

JAXB不是很难使用。您可以在JAXB reference implementation页面阅读它。我是EclipseLink的JAXB提供商MOXy的粉丝。他们有一个非常容易遵循的getting started tutorial

作为奖励,当您将保存游戏文件存储在XML中时,您可以使用任何文本编辑器打开它,并轻松读取游戏状态。这会让你的游戏更容易调试,因为游戏状态是人类可读的。用你目前的格式,你必须计算行数来查找值。

如果您不喜欢XML,那么请使用Java属性文件 - 即使这样做会比原始值更好。