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
之后返回即可。