假设我有一个类似下面的课程:
public class Parameter {
private double[] parameterValues;
public Parameter(double[] parameterValues) throws BadElementInitializationException {
checkParameterValues(parameterValues);
this.parameterValues = parameterValues;
}
public double[] getParameterValues() {
return parameterValues;
}
public void setParameterValues(double[] parameterValues) throws BadElementInitializationException {
checkParameterValues(parameterValues);
this.parameterValues = parameterValues;
}
private void checkParameterValues(double[] parameterValues) throws BadElementInitializationException {
if(parameterValues == null)
throw new BadElementInitializationException("Parameter values cannot be null");
if(parameterValues.length == 0)
throw new BadElementInitializationException("Parameter values cannot be empty");
}
public int noOfValues(){
return parameterValues.length;
}
}
该数组稍后用于执行某些计算。
我的问题是,我应该在哪里检查parameterValues不为null,也不为空?我应该像参考类一样在Parameter类中执行此操作,还是应该在执行计算的类中执行此操作?
此外,我应该在此处或在Calculation类中抛出异常吗?什么是抛出check以及抛出未经检查的异常的原因是什么?我的目标是创建一个不会轻易崩溃的稳定应用程序。
答案 0 :(得分:2)
您应该在获取null或空数组无效的所有地方执行此操作。如果您只是在Parameter
课程中执行此操作并依赖于此Calculator
课程中的检查,那么如果您开始在其他地方使用Calculator
课程该怎么办?你会依赖谁来做那里的检查?如果你在Calculator
课程中进行,然后重构Parameters
课程以便将来使用其他内容,那么你的支票就会消失。
如果在Calculator类中有一个null或空数组也无效,那么你也需要在那里检查。
或者将一个对象传递给两个不能为空的对象,然后你只需要进行空检查。
答案 1 :(得分:1)
我应该在参数类中这样做,就像我一样,或者我应该这样做 在进行计算的类中?
在我看来,最好在Parameter类中检查然后检查任何其他类。您可以在google guava中看到它的作用,例如,在他们使用的大多数课程中:
public static boolean isPowerOfTwo(BigInteger x) {
checkNotNull(x);
return x.signum() > 0 && x.getLowestSetBit() == x.bitLength() - 1;
}
or
public static int log2(BigInteger x, RoundingMode mode) {
checkPositive("x", checkNotNull(x));
...
此外,我应该在此处或计算中抛出异常 类?
如果在Parameter类中检查参数,最好也抛出Parameter类。除此之外,您可以使用一些标准函数来检查并抛出异常,例如来自google guava:
com.google.common.base.Preconditions.checkNotNull
com.google.common.base.Preconditions.checkArgument
com.google.common.math.MathPreconditions.checkPositive
什么是抛出检查和扔什么的原因 未经检查的例外?
如果您认为必须稍后捕获并处理此异常,则检查异常是好的。在大多数情况下,对于错误的参数,足够的未经检查的异常,例如Java中的标准IllegalArgumentException。此外,经过检查的异常需要说其他程序员(使用此API)可能会发生此异常,并且需要使用它。程序员使用未经检查的异常非常容易(并且通常会减少源代码),但是经过检查的异常会使您的代码更可靠。
有关已检查和未经检查的例外的更多信息,您可以在此post
中找到