Как изменить рефакторинг возврата одного и того же значения в обоих методах catch и try? - PullRequest
0 голосов
/ 25 мая 2018

Сонар заметил, что это вонючий код.Как я могу это исправить?

invokeFieldAccessor(property.getField(), this.instance, theValue,
    new FieldAccessorHandler() {
        @Override
        public synchronized Object accessField(
                final Field field, final Object objectInstance,
                final Object value) {
            try {
                field.set(objectInstance, value);
            } catch (Exception e) {
                return null;
            }
            return null;
        }
    });

РЕДАКТИРОВАТЬ: желаемый результат для вернуть ноль с или без исключения

Ответы [ 5 ]

0 голосов
/ 25 мая 2018

Просто сделайте это:

invokeFieldAccessor(property.getField(), this.instance, theValue,
    new FieldAccessorHandler() {
        @Override
        public synchronized void accessField(
                final Field field, final Object objectInstance,
                final Object value) {
            try {
                field.set(objectInstance, value);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
0 голосов
/ 25 мая 2018

В предложении catch вы должны записать исключение или выбросить его заново.Ваша реализация просто скрывает это.И, кроме того, возврат нулевого значения - не лучший подход.

0 голосов
/ 25 мая 2018

Просто уберите возврат из catch:

        try {
          // ...
        } catch (Exception e) {
          // Fall through to the return afterwards...
        }
        return null;

Но я полагаю, что это очень плохая идея - делать ничего с Exception.

Не рекомендуется ловить Exception, либо: вы, вероятно, должны ловить ReflectiveOperationException.

0 голосов
/ 25 мая 2018

Вы возвращаете ноль независимо от результата блока try / catch.Что делает его "вонючим", так это то, что в блоке catch есть возвращаемый нуль, а в блоке try его нет.

Вероятно, здесь есть ошибка.

new FieldAccessorHandler() {
    @Override
    public synchronized Object accessField(
            final Field field, final Object objectInstance,
            final Object value) {
        try {
            field.set(objectInstance, value);

            //Why is nothing being returned here?
        } catch (Exception e) {
            return null;
        }
        return null;
    }
});

Из того, что видно в этом коде, этот метод должен быть пустым методом.Он устанавливает значение, а не читает его, поэтому в любом случае вы по умолчанию возвращаете null.

Так что, скорее всего, вы реализуете неправильный интерфейс или, если вам нужно вернуть значение, отправляетеnull только после попытки / улова:

new FieldAccessorHandler() {
    @Override
    public synchronized Object accessField(
            final Field field, final Object objectInstance,
            final Object value) {
        try {
            field.set(objectInstance, value);
        } catch (Exception e) {
           logger.error(e); //log the exception
        }
        return null;
    }
});
0 голосов
/ 25 мая 2018

Вы можете использовать finally для этого.

try {
...
}
catch {
...
}
finally {
    return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...