【发布时间】:2021-02-20 14:18:12
【问题描述】:
我对 java 还很陌生,我正在尝试在基于文本的 UI 游戏保存和加载中实现两种方法,但是当我在终端中运行 save 命令时遇到了一些困难,我得到了一个 java.util. io.NotSerializableException 我也收到同样的加载错误。本质上我只是想保存游戏状态并加载游戏状态,但我不确定我哪里出错了或者我做得是否正确,非常感谢您的帮助。
public TikTakToeUI() {
scnr = new Scanner(System.in);
game = new TikTakToe();
player = new Player();
}
private void execute(String command)
{
File inFile = new File ("input.txt");
if (command.equalsIgnoreCase("Save")) {
save(inFile);
}else if (command.equalsIgnoreCase("Load")){
load(inFile);
}else {
System.out.println("Unknown command (" + command + ")");
displayMenu();
}
}
private void save(File file)
{
try {
FileOutputStream fileStream = new FileOutputStream(file);
ObjectOutputStream objectStream = new ObjectOutputStream(fileStream);
objectStream.writeObject(game);
objectStream.writeObject(scnr);
objectStream.writeObject(player);
objectStream.close();
fileStream.close();
JOptionPane.showConfirmDialog(null,
"Save game state successfully.",
"Tik Tak Toe Game",
JOptionPane.DEFAULT_OPTION);
} catch (Exception e) {
JOptionPane.showConfirmDialog(null,
e.toString() + "\nFail to save game state.",
"Tik Tak Toe Game",
JOptionPane.DEFAULT_OPTION);
}
}
private void load(File file)
{
try
{
FileInputStream fileStream = new FileInputStream(file);
ObjectInputStream objectStream = new ObjectInputStream(fileStream);
scnr = (Scanner) objectStream.readObject();
game = (TikTakToe) objectStream.readObject();
player = (Player) objectStream.readObject();
}
catch (Exception e) {
JOptionPane.showConfirmDialog(null,
e.toString() + "\nFail to load game state.",
"Tik Tak Toe Game",
JOptionPane.DEFAULT_OPTION);
}
}
【问题讨论】:
-
保存扫描仪对您有意义吗?扫描器是用于解析应用程序的文本输入流的对象。它如何代表“状态”?我的建议:不要使用对象输入/输出流。相反,请考虑一种文本格式,它代表您重新创建对象所需的信息,并从文本文件中保存/恢复,只有该信息。
-
你说得对,因为可以创建一个新的扫描仪,所以我删除了扫描仪,你还能建议什么其他替代方案,我将如何去做?
标签: java