让我们说有这种不可变的记录类型:
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违规,并且抛出了未经检查的异常.
这听起来怎么样?!
请注意,它会抛出一个未经检查的异常.原因是因为这是一个经常使用的对象,并且必须处理已检查的异常是不方便的.
不,我认为你在这里抛出未经检查的异常的原因是因为它涉及该API用户方面违反合同,而不是该方法正常运行期间的异常情况.请参阅Java SDK对NullPointerException,IllegalArgumentException等的使用,它们是RuntimeExceptions,因为它们表示违反合同.
| 归档时间: |
|
| 查看次数: |
554 次 |
| 最近记录: |