如何重构try/catch块中返回相同值的代码?Sonar代码异味修复
修复Sonar检测出的代码异味问题
嘿,我来帮你拆解下这段代码里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; } });
Sonar提示异味的核心原因
Sonar大概率是盯上了这几个问题:
- 不必要的方法级同步:给匿名内部类的
accessField加synchronized,但如果这个方法本身没有并发访问的场景,或者锁的范围完全不合理,这就是冗余的同步操作,还可能带来不必要的性能损耗。 - 过于宽泛的异常捕获:直接捕获
Exception会把所有类型的异常(包括运行时异常、甚至错误)都吞掉,完全不利于后续排查问题,属于不良的异常处理习惯。 - 冗余的return语句:不管try块执行成功还是catch块触发异常,最终都返回null,代码重复啰嗦,完全可以简化。
修复后的代码示例
invokeFieldAccessor(property.getField(), this.instance, theValue, new FieldAccessorHandler() { @Override public Object accessField(final Field field, final Object objectInstance, final Object value) { try { field.set(objectInstance, value); } catch (IllegalAccessException e) { // 建议这里加上日志记录,比如 log.error("字段赋值失败,字段名:{}", field.getName(), e); } return null; } });
关键修复细节说明
- 移除不必要的
synchronized:如果你的业务场景没有并发修改该字段的需求,直接去掉方法上的synchronized即可;如果确实需要同步,建议把同步逻辑移到更合理的外层(比如invokeFieldAccessor方法内部),或者使用一个明确的共享锁对象,避免用匿名类实例作为锁(锁范围不清晰)。 - 捕获具体异常类型:
field.set()方法只会抛出IllegalAccessException这个受检异常,直接捕获它就够了,不要用Exception这种大而全的捕获方式,避免意外吞掉其他不该忽略的异常。 - 简化return逻辑:既然无论成功失败都要返回null,那只需要在方法末尾写一次return即可,去掉catch块里的冗余return,让代码更清爽。
如果你的场景确实需要保留同步,也可以调整成更清晰的同步方式,比如:
// 假设你有一个共享的锁对象,比如在外部类中定义:private final Object fieldLock = new Object(); invokeFieldAccessor(property.getField(), this.instance, theValue, new FieldAccessorHandler() { @Override public Object accessField(final Field field, final Object objectInstance, final Object value) { synchronized (fieldLock) { // 使用明确的共享锁对象 try { field.set(objectInstance, value); } catch (IllegalAccessException e) { log.error("设置字段[{}]失败", field.getName(), e); } return null; } } });
内容的提问来源于stack exchange,提问作者Gorgan Razvan
相关产品推荐
相关产品推荐

