2017-02-11 66 views
0

我正在研究一個在Java中編寫了90%,在Groovy編寫了10%的大型代碼庫。我最近纔開始學習Groovy,並希望得到一些建議。我在Groovy方法中遇到過類似這樣的代碼:GroovyRuntimeException:不明確的方法重載

throw new RuntimeException(getErrorMessage(state)); 

這在大多數情況下都適用。問題是,在這個非常罕見的場合,getErrorMessage(state)返回null而不是String。我無法更改getErrorMessage()的實施。

我可以解決這樣的這一具體問題:

throw new RuntimeException((String) getErrorMessage(state)); 

或者是這樣的:如果我用@CompileStatic

throw new RuntimeException(getErrorMessage(state) ?: '(no detail available)'); 

就不會出現這個問題,但也有代碼的其他部分是依靠動態功能。

我的問題是,我只能通過遇到錯誤報告來解決這些問題,這對於應用程序的可靠性和聲譽來說並不好。 (問題不僅在於getErrorMessage,而且還包括在運行時可能發生模糊過載異常的所有情況。)

如何預先預見此類問題? (目前可用的靜態分析工具似乎並不足夠聰明的抓住這個。)

回答

1

做一個搜索所有getErrorMessage()和更換這些部件myGetErrorMessage()

public String myGetErrorMessage(int state) { 
    return getErrorMessage(state) ?: '(no detail available)'; 
} 

Aspect-Oriented Programming可能是矯枉過正的這種特殊情況下,但它會讓你得到你想要的。您仍然需要以某種方式識別需要干預的所有方法。 This是一篇描述幾個AOP庫的文章。

+0

謝謝,但我的問題不只是'getErrorMessage'。這種方法只是無數的方法之一,有時可以返回null。我正在尋找一種方法來查找所有可能導致模糊方法調用的代碼。 –

+0

如果問題在於Groovy在運行時決定使用哪個重載方法,那麼可以通過添加一個帶有Object的重載方法來'捕捉'任何'null'。當參數爲null時,Groovy將調用該方法。 –