如何在catch和try中重构相同值的返回值?

时间:2018-05-25 12:49:53

标签: java design-patterns

Sonar已经注意到这是一个臭臭的代码。我怎么能解决它?

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;
        }
    });

编辑:所需的输出是返回null 有或没有异常

5 个答案:

答案 0 :(得分:3)

只需从catch

中删除回复即可
        try {
          // ...
        } catch (Exception e) {
          // Fall through to the return afterwards...
        }
        return null;

但我建议用Exception nothing 是一个非常糟糕的主意。

不建议抓住Exception:你应该抓住ReflectiveOperationException

答案 1 :(得分:0)

您可以使用implementation 'org.jsoup:jsoup:1.10.2'来执行此操作。

Document document =  Jsoup.parse(content);
Element element = document.body();
setElement(element);
Utils.appendView(this,getElement().children());
invalidate();

答案 2 :(得分:0)

无论try / catch块的结果如何,都返回null。这个“臭”的原因是catch块中有一个返回null,而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;
    }
});

从此代码中可见的内容,此方法应为void方法。它设置了一个值,而不是读取一个值,这就是为什么你默认返回null的原因。

所以你可能正在实现错误的接口,或者,如果你必须返回一个值,只能在try / catch之后发送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;
    }
});

答案 3 :(得分:0)

在catch子句中,您应该记录异常或重新抛出它。您的实现只是隐藏它。除此之外,返回空值不是最好的方法。

答案 4 :(得分:0)

这样做:

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();
            }
        }
    });