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