首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查或未检查异常

检查或未检查异常
EN

Stack Overflow用户
提问于 2009-08-03 20:35:15
回答 3查看 1.9K关注 0票数 3

可能重复:

When to choose checked and unchecked exceptions

你好!

因此,对于何时抛出检查或未检查的异常,我仍然感到很舒服。我想知道在这种情况下,其他人认为最合适的是什么:

代码语言:javascript
复制
class Correlation<T>
{
    private final T object1, object2;
    private final double correlationCoefficient;

    public Correlation(T object1, T object2, double correlationCoefficient)
    {
        if(Math.abs(correlationCoefficient) > 1.0 || (object1.equals(object2) && correlationCoefficient != 1.0))
            throw new IllegalArgumentException();

        this.object1 = object1;
        this.object2 = object2;
        this.correlationCoefficient = correlationCoefficient;
    }
}

因此,在这种情况下,我想抛出一个运行时异常,因为我很难从用户传入错误数据的情况中恢复过来。我想事先指出,我对传递的数据没有控制权。如果可以,我将创建一个接口,以确保构造函数中的条件为true。然而,对于已经计算出来的相关性来说,这是一个方便的类,所以我必须相信用户正在提供准确的信息。

好吧,让我知道你们都怎么想!

EN

回答 3

Stack Overflow用户

发布于 2009-08-03 20:42:15

我认为这是正确的反应。你实际上是在做障碍断言,即障碍检查,如果它们是错误的,你就是拒绝创建实体。我会用java文档来记录,您可以抛出一个IllegalArgumentException,但除此之外,它看起来是正确的。

约书亚·布洛克有一些关于检查和未检查异常的很好的信息。基本的前提是,除非您绝对希望有人检查异常,否则您应该抛出一个未检查的异常。这种想法可能会使一些编码和返回值复杂化,但一般来说,它会使代码更干净、更高效。在特殊情况下使用异常,事情会对你更好。

只是我的两分钱。

编辑

为了明确起见,这里有一些类似于您应该拥有的java文档:

代码语言:javascript
复制
/**
 * <Something describing constructor, and what it does, ending with a period.>
 *
 * @param parameter <Describe the parameter - do one for each parameter of the constructor,
 *     and note which values may be illegal for that particular parameter.>
 * @throws IllegalArgumentException <the case for the illegal argument exception.>
票数 6
EN

Stack Overflow用户

发布于 2009-08-03 20:39:51

在我看来,答案取决于:

  • 您期望调用方能够优雅地恢复吗?
  • 是用于公共或内部消费的吗?

有人会告诉你,你不应该使用检查异常。这纯粹是主观的。

票数 4
EN

Stack Overflow用户

发布于 2009-08-03 21:11:14

您应该始终在异常中包含解释性文本。在这种情况下,您甚至可以考虑进行两次检查:

代码语言:javascript
复制
    if(Math.abs(correlationCoefficient) > 1.0)
            throw new IllegalArgumentException("abs(correlationCoefficient) > 1.0 - " + correlationCoefficient);
    if((object1.equals(object2) && correlationCoefficient != 1.0))
            throw new IllegalArgumentException("object1==object2, but correlationCoefficient != 1.0, " + correlationCoefficient);

这使得那些真正能够看到堆栈跟踪的人能够识别出确切的原因,而不必仔细地查看代码。给定的异常只应由一个条件触发,而不是由多个条件触发,因为您将无法确定发生了什么。还包括所有必要的信息,因为如果错误情况不能在测试场景中再现,这可能是至关重要的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1224482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档