选中和未选中的例外和设计思路

cch*_*ion 2 java exception

让我们说有这种不可变的记录类型:

public class Record
{
    public Record(int x, int y) {
        Validator.ValidateX(x);
        Validator.ValidateY(y);
        X=x;
        Y=y;
    }

    public final int X;
    public final int Y;

    public static class Validator {
        public void ValidateX(int x) { if(x < 0) { throw new UnCheckedException; } }
        public void ValidateY(int y) { if(y < 0) { throw new UnCheckedException; } }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,它会抛出一个未经检查的异常.原因是因为这是一个经常使用的对象,并且必须处理已检查的异常是不方便的.

但是,如果此对象位于类库中,则可以使用它来验证用户输入(或其他一些外部输入).现在它开始听起来应该是一个CHECKED异常,因为输入不再是程序员.

大家都在想?我应该检查还是取消选中,还是有更好的设计?

更新:

我的困惑来自于这个场景:通常记录会像这样使用:

Record r = new Record(1,2);
OtherObj o = new OtherObj(r);
Run Code Online (Sandbox Code Playgroud)

这取决于程序员,所以未经检查的异常是可以的.

但是,当您从用户获取Record的参数时,您想要对它们进行验证吗?所以你可以打电话

Record.ValidateX(inputX);
Record.ValidateY(inputY);
Run Code Online (Sandbox Code Playgroud)

它可能会抛出一个已检查的异常,因为输入不再受控制?

对不起,我通常不会太在意这个(我个人认为未经检查就好了).但这实际上是家庭作业中的一个问题,我想要把它弄好.

更新(2):我开始认为我需要的是ValidateX抛出一个已检查的异常,因为它通常是涉及用户输入时使用的内容.在这种情况下,我们可以再次要求用户输入.但是,对于Record构造函数,它将抛出已检查的异常,因为构造具有无效参数的Record是API违规.新代码如下所示:

public class Record
{
    public Record(int x, int y) {
        try
        {
            Validator.ValidateX(x);
            Validator.ValidateY(y);
        }catch(CheckedException xcpt) { throw new UnCheckedException(xcpt.getMessage()); }
        X=x;
        Y=y;
    }

    public final int X;
    public final int Y;

    public static class Validator {
        public void ValidateX(int x) throws CheckedException { if(x < 0) { throw new CheckedException; } }
        public void ValidateY(int y) throws CheckedException { if(y < 0) { throw new CheckedException; } }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在程序员可以在将参数传递给Record类之前验证它们.如果没有那么它就是API违规,并且抛出了未经检查的异常.

这听起来怎么样?!

Jon*_*erg 6

请注意,它会抛出一个未经检查的异常.原因是因为这是一个经常使用的对象,并且必须处理已检查的异常是不方便的.

不,我认为你在这里抛出未经检查的异常的原因是因为它涉及该API用户方面违反合同,而不是该方法正常运行期间的异常情况.请参阅Java SDK对NullPointerException,IllegalArgumentException等的使用,它们是RuntimeExceptions,因为它们表示违反合同.