在哪里检查值并抛出异常

时间:2015-12-11 10:45:59

标签: java exception

假设我有一个类似下面的课程:

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以及抛出未经检查的异常的原因是什么?我的目标是创建一个不会轻易崩溃的稳定应用程序。

2 个答案:

答案 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

中找到