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

Java 如何在catch和try中重构相同值的返回?,java,design-patterns,Java,Design Patterns,声纳发现这是一个很臭的密码。我怎样才能修好它 invokeFieldAccessor(property.getField(), this.instance, theValue, new FieldAccessorHandler() { @Override public synchronized Object accessField( final Field field, final Object objectInstance

声纳发现这是一个很臭的密码。我怎样才能修好它

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

编辑:所需的输出是返回空值,无论有无异常

您可以使用
最终
来执行此操作

try {
...
}
catch {
...
}
finally {
    return null;
}

只需从
捕捉器中删除返回:

        try {
          // ...
        } catch (Exception e) {
          // Fall through to the return afterwards...
        }
        return null;
但我认为,不处理
异常是一个非常糟糕的主意


不建议捕获
异常
:您可能应该捕获
ReflectiveOperationException

无论try/catch块的结果如何,您都将返回null。让这个“难闻”的是catch块中有一个返回null,而try块没有任何返回null

很可能这里有个bug

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

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

只需执行以下操作:

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

在代码中,即使没有异常发生,也返回null。这是你想要的行为吗?是的。我编辑过这篇文章。不要从
最后返回
。只需在
try/catch
之后返回即可。