gpt4 book ai didi

java - 什么时候适合抛出异常?

转载 作者:搜寻专家 更新时间:2023-11-01 02:58:47 25 4
gpt4 key购买 nike

我最近看到一些代码,其中作者在返回 int 的方法中为几乎每个构造函数抛出异常并为类似下面的代码抛出运行时异常:

if(condition){
return 1;
}
if(condition){
return 2;
}
if(condition){
return 3;
}
throw new RuntimeException("Unreachable code");
// method ends here

我个人不会在那里抛出异常,因为我会使用 if 和 else if 语句来构造它,在这种特殊情况下,您的代码根本就错了,因为它无论如何都不满足其中一个条件。

有很多地方你可以抛出运行时异常,如果你的代码正常工作就永远不会到达,有时看起来作者不相信代码可以工作,在代码的情况下挡在上面。此外,如果每个构造函数未正确初始化,它都可以抛出异常,但您也可以构造它以使对象为 null - 例如,您随后可以在 main 中检查它。

基本上,我要问的是什么时候值得抛出异常?

最佳答案

异常(exception)的意义在于传达异常(exception)情况。

从这个意义上说:如果在您的示例中所有条件都是 false 绝对出乎意料,并且也没有有效的返回值来指示这种情况,那么抛出 RuntimeException 是合理的在这里要做的事;但我可能会将消息更改为:

throw new RuntimeException("All conditions failed: " + some data)

如前所述:它是关于沟通的;在这种情况下,调试问题的人。因此,在此处包含了解为什么所有这些检查结果都是 false 所需的信息可能会有所帮助。

要点是:该方法有契约(Contract);该契约(Contract)应包括此类细节。意思是:如果该方法是公共(public)的,您可能应该添加一个带有清晰描述的@throws RuntimeException。

在这种情况下使用 RuntimeException 也是一种有效的做法;因为您不想到处都使用已检查的异常来污染您的方法签名。

编辑:当然,平衡是必需的。示例:我的类(class)通常如下所示:

public class Whatever {
private final Foo theFoo;

public Whatever(Foo theFoo) {
Objects.requireNonNull(theFoo, "theFoo must not be null");
this.theFoo = theFoo;

因此,我的构造函数可能会抛出一个 NPE;是的。但是:只有那里。我所有的方法都可以依赖于所有字段都被初始化为非空的事实;并且它们是最终的,所以它们将始终是非空的。

意思是:一个人必须保持理性;并“培养”一种感觉:哪些问题是异常(exception)但可能发生的;哪些是不可能的,以至于您不会到处污染您的代码来检查它们。

最后;只是为了说明这一点 - 添加异常(exception)只是等式的一个部分。当有东西抛出时,您需要捕获一些东西!因此,正如所说:平衡出现了。无论您在代码中做什么,都必须为其“增加值(value)”。如果您的代码没有实现明确定义的目的,那么很有可能:您不需要它!

关于java - 什么时候适合抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43208932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com