我正试图为一个刽子手游戏制作一个高分。所以我需要保存它,所以每次你开始游戏或返回菜单都没有重启..所以我有一个游戏状态记录游戏结束时的输赢,如果用户离开之前解决它会增加一个损失。我发现了一个通过SavaData文件保存的教程..问题是它保存了一个空文件,但是有2个空行..所以我得到一个numberformatexception null ..我之前有它工作但它仍然无法读取该行并将返回一个错误numberformatexception Integer.parseInt ..我知道问题是在阅读行,现在我不知道出了什么问题请帮帮我..什么错了代码?感谢名单
这是保存代码......
private void createSaveData() {
File file = new File(saveDataPath, filename);
try {
FileWriter output = new FileWriter(file);
BufferedWriter writer = new BufferedWriter(output);
writer.write("" + 0);
writer.newLine();
writer.write("" + 0);
} catch (Exception e) {
e.printStackTrace();
}
}
private void setScores() {
FileWriter output = null;
try {
File F = new File(saveDataPath, filename);
output = new FileWriter(F);
BufferedWriter writer = new BufferedWriter(output);
writer.write(wins);
writer.newLine();
writer.write(losses);
writer.close();
}catch (Exception e){
e.printStackTrace();
}
}
private void loadScores() {
try {
File F = new File(saveDataPath, filename);
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(F)));
String line = reader.readLine();
line = reader.readLine();
wins = Integer.parseInt(line);
line = reader.readLine();
losses = Integer.parseInt(line);
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
然后我添加loadScore();在playstate的乞讨..和setScore();赢得++或亏损之后......
我有另一个调用playstate的高速状态,并以整数形式获得胜利和失败,并且没有问题,因为它会绘制0,0。
在我的渲染方法中,如果尝试太多或者猜对了正确的答案,我就有这个...
if (tries == 6) {
currentWord = ranWord;
execcurrentframe.setRegion(eman.ExecLoss.getKeyFrame(elapsedTime, false));
hangcurrentframe.setRegion(hman.hangdead.getKeyFrame(elapsedTime, false));
Wordsfont.draw(batch, "Game Over", eman.getPosition().x + 60, hman.getPosition().y + 70);
batch.draw(fu, 160, 510);
if (leverpressed == false){
bksound.stop();
lever.play();
leverpressed = true;
}
if (lossrecorded == false) {
losses += 1;
System.out.print("Losses = " + losses);
setScores();
lossrecorded = true;
}
}
else if (CorrectAnswer == true) {
hangcurrentframe.setRegion(hman.hangwin.getKeyFrame(elapsedTime, false));
Wordsfont.draw(batch, "You Won", eman.getPosition().x + 60, hman.getPosition().y + 70);
if (winrecorded == false) {
bksound.stop();
victory.play();
wins += 1;
System.out.print("Wins = " + wins);
setScores();
winrecorded = true;
}
}
答案 0 :(得分:0)
您忽略了原始createSaveData
方法的一个重要部分:
writer.write("" + 0);
看到"" + 0
?它有效地将整数转换为字符串(尽管有更优雅的方法)。
BufferedWriter
已超载write
方法。这意味着当参数为String
时,会调用另一种方法,当参数为int
时,会调用另一种方法。
您已调用参数为int
的版本。其documentation说:
public void write(int c) throws IOException
写一个字符。
<强>覆盖强>:
写在类Writer
<强>参数:强>
c
-int
指定一个角色 写入<强>抛出:强>
IOException
- 如果发生I / O错误
这告诉您它认为您作为角色传递的int
。也就是说,如果你给它int 65
,它将被视为字符A
。如果您将int 48
赋予它,则将其视为字符0
。
如果你给它整数0
,这就是NUL
控制字符。
当您将其作为字符串读回时,它将被视为包含NUL
字符的单字符字符串。当然,这不是数字的有效字符串格式。
所以替换
writer.write(wins);
使用
writer.write(String.valueOf(wins));
并为损失做同样的事。
答案 1 :(得分:0)
我建议进行以下更改。
使用单个writeSaveData
方法。 createSaveData
和setScores
之间的代码基本上是重复的。另外,使用Integer.toString()
写入输出。此外,确保关闭流(此处使用try with resources)。
private void writeSaveData(int wins, int losses)
{
File file = new File(saveDataPath, filename);
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
writer.write(Integer.toString(wins));
writer.newLine();
writer.write(Integer.toString(losses));
}
catch (Exception e) {
e.printStackTrace();
}
}
readLine()
方法中有一个额外的loadScores()
。删除额外的行。更改使用尝试使用资源。
private void loadScores()
{
File file = new File(saveDataPath, filename);
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)))) {
String line = reader.readLine();
// line = reader.readLine() <-- REMOVE THIS LINE
wins = Integer.parseInt(line);
line = reader.readLine();
losses = Integer.parseInt(line);
reader.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
编辑:如果无法使用资源尝试,则可以使用以下方法。
private void loadScores()
{
File file = new File(saveDataPath, filename);
BufferedReader reader = null;
// try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)))) {
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
String line = reader.readLine();
wins = Integer.parseInt(line);
line = reader.readLine();
losses = Integer.parseInt(line);
}
catch (Exception e) {
e.printStackTrace();
}
finally {
if (reader != null) {
try {
reader.close();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
}
可以对建议的writeSaveData()
或其他方法进行类似的修改。