Java 在何处检查值并引发异常

Java 在何处检查值并引发异常,java,exception,Java,Exception,假设我有一门课,如下所示: public class Parameter { private double[] parameterValues; public Parameter(double[] parameterValues) throws BadElementInitializationException { checkParameterValues(parameterValues); this.parameterValues = parameterValues; }

假设我有一门课,如下所示:

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或空?我应该像以前一样在参数类中这样做,还是应该在执行计算的类中这样做


此外,我应该在这里抛出异常,还是在计算类中抛出异常?抛出checked和抛出unchecked异常的原因是什么?我的目标是创建一个稳定的应用程序,它不会轻易崩溃。

在获取空数组无效的所有地方都应该这样做。如果您仅在
参数
类中执行此操作,并且在
计算器
类中完成检查后依靠此操作,那么如果您开始在其他地方使用
计算器
类会怎么样?你要依靠谁在那里做检查?如果您在
计算器
类中执行此操作,然后重构
参数
类以在将来使用其他内容,那么您的检查将消失

如果在计算器类中使用null或空数组也是无效的,那么您也需要检查它

或者,将一个对象同时传递给这两个对象,该对象不能为空,然后只需进行null检查

我应该像以前那样在参数类中这样做,还是应该这样做 班上做计算的那个

在我看来,签入参数类比签入任何其他类更好。例如,在他们使用的大多数类中,您可以看到它是如何工作的:

  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类。除此之外,您还可以使用一些standart函数检查并引发异常,例如:

扔支票的原因是什么?扔什么 未检查的异常

如果您认为以后必须捕获并处理此异常,那么选中的异常是好的。在大多数情况下,对于错误的参数,不检查异常就足够了,比如Java中的standart。此外,检查异常需要告诉其他程序员(使用此API的程序员)可能发生此异常,并且他们需要处理此异常。对于程序员来说,处理未检查的异常非常容易(通常会减少源代码),但是检查的异常会使您的代码更加可靠


有关选中和未选中异常的更多信息,您可以在此

中找到,我建议将参数类设置为相同,并在计算类中处理异常。因此,您可以根据扩展参数类的场景定义处理机制。感谢您的回答和参考。感谢您的回答,它非常有用。我最终接受了你的回答,因为你提供了更多的论据,并提到了未来可能出现的问题。我认为在这两个地方都检查是过分的,但我知道我可以接受。您是否对要抛出的异常类型有任何意见?您应该抛出一个标准异常(在java中,我认为这是IllegalArgumentException),或者您应该抛出一个由此派生的特定异常。我个人认为,检查异常在Java中是一个设计错误,所以我会避免它们,但这主要是我个人的观点。
  com.google.common.base.Preconditions.checkNotNull
  com.google.common.base.Preconditions.checkArgument 
  com.google.common.math.MathPreconditions.checkPositive