在我的控制台应用程序中,我只希望在出现错误时以完整的图形深度打印错误消息。
我通过递归遍历所有节点来验证图样(Json)数据。如果将为一个叶子节点打印一条错误消息,则我想(延迟)在该第一条叶子错误消息之前输出所有父节点的名称。
编辑:让我们假设我正在遍历这样的文件结构
A-B-C-D
| -X-Z
我只想在出现错误时才打印到控制台输出。
对于第一个示例,示例可能在C中出错。因此,在验证A和B时,不会进行输出。在检查C时,会注意到该错误,并且所有Info-Level消息(例如,节点A和B的名称)都应在错误消息之前打印:
仅输出当前树路径的输出。对于第二个示例,错误可能在Z中发生:
1.检查A:没有错误,输出:-
2.检查B:没有错误,输出:-
3.检查C:没有错误,输出:-
4.检查D:没有错误,输出:-
5.检查X:没有错误,输出:-
6.检查Z:错误,输出:“检查A”,“检查B”,“检查X”,“检查Z”,“ Z字错误”
编辑: 现在这是我当前的解决方案。
public class Log {
private static final int indentStep = 4;
static public int indent = 1;
static private ArrayList<String> messages = new ArrayList<String>();
static public void incIndent() {
indent += indentStep;
}
static public void decIndent() {
indent = indent > indentStep ? indent - indentStep : 1;
}
public static void log(final Object msg) {
System.out.println(String.format("%" + indent + "c", ' ') + msg);
}
public static void logError(final Object msg) {
System.err.println(String.format("%" + indent + "c", ' ') + msg);
}
public static int push(String s) {
messages.add(String.format("%" + indent + "c", ' ') + s);
return messages.size() - 1;
}
public static void error(String e) {
for (String s : messages) {
System.out.println(s);
}
messages.clear();
System.err.println(String.format("%" + indent + "c", ' ') + e);
}
public static void pop(int i) {
while (messages.size() > i) {
messages.remove(i);
}
}
}
现在使用它的方法如下:
void validateChecksumFile(){
int logLevel = Log.push("Title");
if(errorCondition){
Log.error("Errormessage");
}
Log.pop(logLevel);
}
仅当在其后打印“ Errormessage”时才打印“ Title”。 这符合我的功能要求,但我认为必须有一个更简单的解决方案。