所以我正在制作一个游戏(一个超过3500行代码的巨大代码)并且在编写游戏的保存功能时遇到了错误。它保存得很好但是当我尝试加载其中一个文件时我保存游戏给它返回一个错误:
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)
依旧......
基本上说我用来扫描文件的扫描仪正在返回“”。我已多次查看源代码,但我无法让我工作。这是SavingManager类:
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();
}
}
我试图解析的文件内容:
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;
}
如果还有什么需要修复此错误,请说明。谢谢你的时间。托尔斯泰。
答案 0 :(得分:3)
不要费心编写自己的对象持久性代码 - 现有解决方案。对于您的数据,我建议您将游戏状态存储为对象。使用JAXB编组对象(即以XML格式写入磁盘)并解组对象(即通过读取XML文件创建对象)。
JAXB使用起来并不是很难。您可以在JAXB reference implementation页面上阅读。我是EclipseLink的JAXB提供商MOXy的粉丝。他们有一个非常容易理解的getting started tutorial。
作为奖励,当您以XML格式存储保存游戏文件时,您将能够使用任何文本编辑器打开它并轻松阅读游戏状态。这将使游戏调试变得更容易,因为游戏状态将是人类可读的。使用当前格式,您必须计算行数以查找值。
如果您不喜欢XML,那么请使用Java属性文件 - 即使这样也不仅仅是原始值。
答案 1 :(得分:0)
我认为,当上次执行for循环{GroundState.Parse(scan.nextInt())}中的语句scan.nextInt()时,文件读取指针位于该行的末尾。然后调用nextLine()将返回“”(空字符串)。所以你需要做的就是从处理中跳过这个特殊的空字符串。