2013-03-11 55 views
4

我有一個包含混合Java和Groovy代碼的代碼庫。對於在Groovy代碼迭代,我們傾向於使用閉包:通過一次步進一行,在strings.each()(即println string)執行代碼使用IntelliJ IDEA在Groovy中調試迭代(閉包)

String[] strings = ["First", "Second", "Third"] 
strings.each { string -> 
    println string 
} 

當調試這一點的IntelliJ IDEA(11節)跨過。我可以在println行放置一個斷點,我可以對其進行調試,但這是一個小解決方法,很好的避免。

是否有配置的IntelliJ不跨過Groovy閉包的方法嗎?沒有適用的選項File-> Settings-> Debugger-> Groovy

編輯:

爲了澄清我所期望的IntelliJ做:

說我有一個Java風格的迭代是這樣的:

for (String string : strings) { 
    println string 
} 

如果我使用 「步過」,調試器步入迭代沒有問題。我可以繼續「跨越」,仍然在循環中,直到沒有更多的對象要迭代。這就是我期望像上面那樣關閉的東西。

在手動設置斷點的一個或兩個關閉的情況下,這可能不是問題。但是,如果有很多,那麼「自動」進入它們就會非常乾淨。

+0

你在做'進入'嗎? (F7快捷鍵) – 2013-03-11 09:27:16

+0

@Nebelmann如果我'進入'我必須逐步完成整個Groovy類的設置迭代。我終於在循環內部結束了,但到達那裏還是很麻煩。 – Magnilex 2013-03-11 09:32:39

+1

恐怕沒有什麼可以做的,然後......據我所知,'each'是一個閉包,所以如果你跨過它將跳過整個功能,如果你介入你將不得不處理很多'噪聲',就像在Java中,當你想要進入一個Spring bean方法調用並最終在代理中進行時...在閉包的第一行設置一個斷點是我意識到的唯一解決方案。 **編輯**:我剛剛發現了IntelliJ的'調試器>步進'選項,這可能會阻止你與groovy的內部結構掙扎......這是值得給它一個嘗試:) – 2013-03-11 09:41:53

回答

3

我完全同意有需要在更好的IntelliJ調試閉幕的支持,因爲你所要求做的並不總是那麼簡單,因爲它應該是沒有通過一些箍跳躍。

就像你找到的那樣,你可以在println行上放置一個斷點,這通常會讓你在閉包(但並非總是)內斷開。一旦你的一個斷點,IntelliJ有一個非常強大的條件斷點系統,它可以讓你更好地控制何時斷點。

我發現有用不時另一條路線,以時間把一切都在工廠關閉,並將其扔進了一種方法,關閉電話,而不是直接在其關閉的代碼。這並不會改變運行時行爲太多,我發現它讓我對事物有更多的控制。它通常也表明我需要重構,因爲挖掘該代碼已經太痛苦了。

+0

感謝您的想法,他們很有幫助。儘管將「閉包代碼」移入方法並不能真正幫助我。我真正想要的只是進入閉包,就像進入Java循環一樣。 – Magnilex 2013-03-12 14:14:13

+0

我同意。希望IntelliJ開發者能夠看到這篇文章,並將其作爲即將發佈的版本中的高優先級功能加入。我知道他們看着Stack Overflow,而且我知道我已經處理了一堆不同的人。 – cdeszaq 2013-03-12 14:46:03