使用 return 语句只是为了满足语法不好的做法吗?

2022-08-31 12:18:00

请考虑以下代码:

public Object getClone(Cloneable a) throws TotallyFooException {

    if (a == null) {
        throw new TotallyFooException();
    }
    else {
        try {
            return a.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
    //cant be reached, in for syntax
    return null;
}

这是必要的,因为可能会捕获异常,但是在这种情况下,由于我们已经检查了它是否为null(并假设我们知道我们正在调用的类支持克隆),因此我们知道try语句永远不会失败。return null;

为了满足语法并避免编译错误(带有注释解释不会到达它),在末尾放置额外的 return 语句是不好的做法,还是有更好的方法来编写类似的东西,以便不需要额外的 return 语句?


答案 1

无需额外返回语句的更清晰方法如下。我也不会抓住,但让它去给呼叫者。CloneNotSupportedException

if (a != null) {
    try {
        return a.clone();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
}
throw new TotallyFooException();

几乎总是有可能摆弄顺序,最终得到一个比你最初拥有的更直接的语法。


答案 2

它绝对可以到达。请注意,您只是在子句中打印堆栈跟踪。catch

在并且出现异常的情况下,达到。您可以删除该语句并将其替换为 。a != nullreturn nullthrow new TotallyFooException();

一般而言*,如果是方法的有效结果(即用户期望它并且它意味着什么),则将其作为“未找到数据”或发生异常的信号返回不是一个好主意。否则,我看不出你不应该回来的任何问题。nullnull

Scanner#ioException 方法为例:

返回此扫描程序的基础可读抛出的最后一个。如果不存在此类异常,则此方法返回 nullIOException

在这种情况下,返回值具有明确的含义,当我使用该方法时,我可以确定我得到只是因为没有这样的异常,而不是因为该方法尝试做某事而失败了。nullnull

*请注意,有时即使含义模棱两可,您也确实希望返回。例如,HashMap#getnull

返回值 null 并不一定表示映射不包含键的映射;映射也可能显式将键映射到 null。该操作可用于区分这两种情况。containsKey

在这种情况下,可以指示已找到并返回该值,或者哈希映射不包含请求的键。nullnull