4

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

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

我想闭嘴,但我不知道它来自哪里。该应用程序很大,我对此了解不多。我可能可以通过在代码运行时单步执行代码来找到罪魁祸首,但我想知道有没有更聪明的方法?

4

2 回答 2

8

我发现了有问题的打印语句(在 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!");
        }
    }
});
于 2013-11-10T09:38:23.843 回答
2

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.

于 2013-11-09T17:12:35.270 回答