2017-02-11 3 views
0

Я работаю над большой базой кода, написанной на 90% в Java и 10% в Groovy. Я только недавно начал изучать Groovy и хотел бы получить некоторые советы. Я получил такой код в методе Groovy:GroovyRuntimeException: Перегрузка неоднозначных методов

throw new RuntimeException(getErrorMessage(state)); 

Это работает большую часть времени. Проблема в том, что в этом очень редком случае getErrorMessage(state) вернул 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. Я ищу способ найти все вхождения кода, которые могут привести к двусмысленному вызову метода. –

+0

Если проблема заключается в том, что Groovy решает во время выполнения перегруженный метод, вы можете «поймать» любой «нуль», добавив перегруженный метод с помощью Object. Groovy вызовет этот метод, когда аргумент равен «null». –

Смежные вопросы