我正在调试一个 Java 应用程序,该应用程序在启动过程中帮助将其打印到控制台大约十几次:
java.awt.Dimension[width=140,height=122]
我想闭嘴,但我不知道它来自哪里。该应用程序很大,我对此了解不多。我可能可以通过在代码运行时单步执行代码来找到罪魁祸首,但我想知道有没有更聪明的方法?
我发现了有问题的打印语句(在 getPreferredSize() 方法中),但我也找到了更通用的解决方案。理论上,通过替换System.out
使用System.setOut
它可以在打印语句发生时捕获它。
这并不完全可靠,因为:(1) 类PrintStream有许多针对不同数据类型的打印方法,并且没有一个好的单一方法可以覆盖。进行实际输出的方法是私有的。(2) 如果需要,代码可以将消息拆分为单个字符,因此没有简单的方法来进行String.contains()
检查。
尽管如此,作为一种快速调试技巧,这似乎工作得很好:
System.setOut(new java.io.PrintStream(
new java.io.FileOutputStream(java.io.FileDescriptor.out)) {
@Override
public void print(String s) {
super.print(s);
if (s.contains("java.awt.Dimension")) {
throw new RuntimeException("Found you!");
}
}
});
You must be printing the object of Dimension
class in your code somewhere. What you see as output:
java.awt.Dimension[width=140,height=122]
comes when toString
method of Dimension
class will be called. Here is the source of toString
from Dimension
class:
public String toString() {
return getClass().getName() + "[width=" + width + ",height=" + height + "]";
}
So look for Dimension
class objects in your code, especially in System.out.println
.