我编写了一个程序来帮助用户配置游戏的机会。我正在处理加载用户保存的数据。这些数据可能(有时会)部分损坏(由于我身边的错误或游戏数据/规则从上游的变化)。
我需要能够尽可能地处理这种损坏并加载。更具体地说,保存文件的内容在语法上是正确的,但在语义上是破坏的。我可以安全地解析文件并删除任何非语义上的条目。
目前,我的数据解析器只会显示一个带有相应警告消息的模态对话框。但是,显示警告不是解析器的工作,我正在寻找将此信息传递给调用者的方法。
一些代码可以显示正在发生的事情(实际上还有比这更多的事情,但这突出了问题):
class Parser{
public void parse(XMLNode aNode){
...
if(corrupted) {
JOptionPane.showMessageDialog(null, "Corrupted data found",
"error!", JOptionPane.WARNING_MESSAGE);
// Keep calm and carry on
}
}
}
class UserData{
static UserData loadFromFile(File aFile){
UserData data = new UserData();
Parser parser = new Parser();
XMLDoc doc = fromXml(aFile);
for(XMLNode entry : doc.allEntries()){
data.append(parser.parse(entry));
}
return data;
}
}
这里的问题是,IOException
或XML中的语法错误,loadFromFile
将始终成功加载某些内容,这是想要的行为。不知何故,我只需要传递调用者出错的信息(如果有的话)。我可以返回Pair<UserData,String>
,但这看起来并不漂亮。在这种情况下抛出异常显然不起作用。
有没有人对如何解决这个问题有任何想法?
答案 0 :(得分:1)
根据您要表示的内容,您可以使用类,例如SQLWarning
包中的java.sql。如果您有java.sql.Statement
并致电executeQuery
,则会获得java.sql.ResultSet
,然后您可以直接在结果集上调用getWarnings
,甚至可以在语句本身上调用{\ n}。
您可以RefUpdate.Result
项目使用枚举,例如JGit。如果您有org.eclipse.jgit.api.Git
,则可以创建一个FetchCommand
,它会为您提供FetchResult
,它将为您提供TrackingRefUpdates
的集合,每个集合包含一个RefUpdate.Result
FAST_FORWARD
FORCED
IO_FAILURE
LOCK_FAILURE
NEW
NO_CHANGE
NOT_ATTEMPTED
REJECTED
REJECTED_CURRENT_BRANCH
RENAMED
枚举,可以是以下之一:
class UserData {
public boolean isCorrupt();
}
在您的情况下,您甚至可以使用布尔标志:
UserDataReader
但是既然你提到实际上还有更多的事情发生,那真的取决于你的#34;腐败&#34;的模式。但是, 如果您有{{1}}可以实例化,而不是静态实用工具方法,则可能会有更多选项 。