2017-02-11 10 views
0

Ich arbeite an einer großen Code-Basis, die 90% in Java und 10% in Groovy geschrieben wurde. Ich habe erst vor kurzem angefangen, Groovy zu lernen und hätte gerne einen Ratschlag. Ich habe Code in einer Groovy-Methode wie folgt gefunden:GroovyRuntimeException: Mehrdeutige Methode überladen

Dies funktioniert die meiste Zeit. Das Problem ist, dass in diesem sehr seltenen Fall getErrorMessage(state) null anstelle eines Strings zurückgegeben hat. Ich kann die Implementierung von getErrorMessage() nicht ändern.

kann ich dieses besondere Problem wie dieses Problem zu beheben:

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

oder so:

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

Dieses Problem würde nicht entstehen, wenn ich @CompileStatic verwendet, aber es gibt auch andere Teile des Codes, Verlassen Sie sich auf dynamische Funktionen.

Mein Problem ist, dass ich solche Probleme nur beheben kann, indem ich sie aufgrund eines Fehlerberichts stoße, was nicht gut für die Zuverlässigkeit und Reputation der Anwendung ist. (Auch das Problem besteht nicht nur bei getErrorMessage, sondern bei allen möglichen Situationen, in denen eine mehrdeutige Überlastungsausnahme zur Laufzeit auftreten kann.)

Wie kann ich solche Probleme vorher erkennen? (Derzeit verfügbare statische Analyse-Tools scheinen nicht klug genug ist, um diese zu fangen.)

Antwort

1

Führen Sie eine Suche für alle getErrorMessage() und ersetzen sie für myGetErrorMessage():

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

Aspect-Oriented Programming kann zu viel des Guten für diesen speziellen Fall , aber es wird dich bekommen, was du willst. Sie müssen immer noch alle Methoden identifizieren, die eine Intervention benötigen. This ist ein Artikel, der mehrere AOP-Bibliotheken beschreibt.

+0

Danke, aber mein Problem ist nicht nur mit 'getErrorMessage'. Diese Methode ist nur eine von unzähligen Methoden, die manchmal null zurückgeben können. Ich suche nach einer Möglichkeit, alle Vorkommen von Code zu finden, die möglicherweise zu einem mehrdeutigen Methodenaufruf führen. –

+0

Wenn das Problem ist, dass Groovy zur Laufzeit entscheidet, welche überladene Methode zu verwenden ist, können Sie "null" fangen, indem Sie eine überladene Methode hinzufügen, die ein Objekt verwendet. Groovy ruft diese Methode auf, wenn das Argument 'null' ist. –

Verwandte Themen