2013-11-09 59 views
1

我調試Java應用程序在啓動過程中有益打印此約了十幾次控制檯:查找打印呼叫源

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

我要關閉它,但我不知道它的到來從。該應用程序是巨大的,我不太瞭解它。我可能會在運行代碼時逐步找到罪魁禍首,但我想知道有沒有更聰明的方法?

回答

2

您必須在代碼的某處打印Dimension類的對象。你所看到的輸出:

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

來當Dimension類的toString方法將被調用。下面是從toStringDimension來源:

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

因此,尋找Dimension類對象在你的代碼,尤其是在System.out.println

5

我發現我的違規打印語句(在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!"); 
     } 
    } 
});