查找打印呼叫的来源



我正在调试一个 Java 应用程序,该应用程序在启动期间将其打印到控制台大约十几次:

java.awt.Dimension[width=140,height=122]

我想把它关起来,但我不知道它来自哪里。该应用程序很大,我对此知之甚少。我可能可以通过在代码运行时逐步执行代码来找到罪魁祸首,但我想知道有没有更聪明的方法?

我找到了我有问题的打印语句(在getPreferredSize()方法中),但我也发现了一个更通用的解决方案。通过使用System.setOut替换System.out,理论上可以在发生打印语句时捕获它。

这并不完全可靠,因为:(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!");
        }
    }
});
您必须

在代码中的某个地方打印Dimension类的对象。您看到的输出:

java.awt.Dimension[width=140,height=122]

toStringDimension方法将被调用时。以下是DimensiontoString的来源:

   public String toString() {
    return getClass().getName() + "[width=" + width + ",height=" + height + "]";
    }

因此,请在代码中查找Dimension类对象,尤其是在System.out.println中。

最新更新