2017-02-11 6 views
0

Javaで90%、Groovyで10%と書かれた大きなコードベースで作業しています。私は最近Groovyを学び始めたばかりで、いくつかのアドバイスが必要です。私はGroovyメソッドで次のようなコードを見つけました。GroovyRuntimeException:あいまいなメソッドのオーバーロード

throw new RuntimeException(getErrorMessage(state)); 

これはほとんどの場合動作します。問題は、このまれなケースでは、getErrorMessage(state)がStringの代わりにnullを返すということです。 getErrorMessage()の実装を変更することはできません。

私はこのようなこの特定の問題が解決することができます。

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

またはこのような:

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

私は@CompileStaticを使用した場合、この問題は発生しないだろうが、そのコードの他の部分がありますが動的な機能に依存しています。

私の問題は、アプリケーションの信頼性と評判には不十分なバグレポートの結果として、そのような問題のみを解決できることです。 (また、問題はgetErrorMessageだけではなく、実行時にあいまいなオーバーロード例外が発生する可能性があるすべての状況で発生します)。

どのように事前にそのような問題を予見できますか? (現在利用可能な静的解析ツールはこれをキャッチしてくれているようだしないでください。)

答えて

1

すべてgetErrorMessage()の検索を行うとmyGetErrorMessage()のためにそれらを置き換える:

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

Aspect-Oriented Programmingは、この特定のケースのためにやり過ぎかもしれしかし、それはあなたが望むものを得るでしょう。介入が必要なすべての方法を何らかの形で特定する必要があります。 Thisは、いくつかのAOPライブラリを説明する記事です。

+0

ありがとうございますが、私の問題は 'getErrorMessage'だけではありません。このメソッドは、nullを返すことのある無数のメソッドの1つに過ぎません。私はおそらくあいまいなメソッド呼び出しを引き起こす可能性のあるコードのすべての出現を見つける方法を探しています。 –

+0

Groovyが使用するオーバーロードされたメソッドを実行時に決定するという問題がある場合は、オブジェクトを取得するオーバーロードされたメソッドを追加することによって、「null」を「キャッチ」できます。 Groovyは、引数が 'null'のときにそのメソッドを呼び出します。 –

関連する問題