假设我在一个非常大的项目中工作,并且注意到一个空的打印行,所以我假设有一个 System.out.println(""); 位于代码中的某处。除了在整个项目中搜索所有出现的 System.out.println 之外,我将如何尝试找出它的位置?
您可以实现自己的PrintStream并用于System.setOut替换默认的标准输出。然后要么在类中放置一个调试标记(如果打印空字符串),要么通过调用堆栈打印出方法名称(抛出并捕获异常并获取堆栈信息)。
如果您使用的是 Java 8+,Durian有一个StackDumper类,它可以轻松找到给定行的打印位置:
StackDumper.dumpWhenSysOutContains("SomeTrigger")
Run Code Online (Sandbox Code Playgroud)
当打印“SomeTrigger”时,这将被转储到System.err:
+----------\
| Triggered by SomeTrigger
| at package.MyClass.myMethod(MyClass.java:62)
| (the rest of the stacktrace)
+----------/
Run Code Online (Sandbox Code Playgroud)
对于你的情况(寻找一个空字符串),它有点复杂:
PrintStream sysOutClean = System.out;
StringPrinter sysOutReplacement = new StringPrinter(StringPrinter.stringsToLines(line -> {
if (line.isEmpty()) {
StackDumper.dump("Found empty line");
}
sysOutClean.println(line);
}));
System.setOut(sysOutReplacement.toPrintStream());
Run Code Online (Sandbox Code Playgroud)
现在,如果有这样的事情:
System.out.println("ABC");
System.out.println("123");
System.out.println("");
System.out.println("DEF");
Run Code Online (Sandbox Code Playgroud)
然后您的控制台将如下所示:
ABC
123
+----------\
| Found empty line
| at package.MyClass.myMethod(MyClass.java:62)
| (the rest of the stacktrace)
+----------/
DEF
Run Code Online (Sandbox Code Playgroud)