当您编写方法时,您几乎总是必须检查必须有效的东西。
假设您需要抛出一个IllegalArgumentException
方法的价格参数是否无效。因为我想把我的程序分成小块,所以我为它创建了一个私有方法。但是,最好的做法是创建一个名为类似的方法validatePrize
并返回一个布尔值,然后我在 if 语句中检查我调用该validatePrize
方法的位置,然后抛出 IllegalArgumentException?
还是该方法不返回任何内容并抛出异常更好?
当您编写方法时,您几乎总是必须检查必须有效的东西。
假设您需要抛出一个IllegalArgumentException
方法的价格参数是否无效。因为我想把我的程序分成小块,所以我为它创建了一个私有方法。但是,最好的做法是创建一个名为类似的方法validatePrize
并返回一个布尔值,然后我在 if 语句中检查我调用该validatePrize
方法的位置,然后抛出 IllegalArgumentException?
还是该方法不返回任何内容并抛出异常更好?
我会说这个问题的答案主要是基于偏好。如果您想要一个在调用时不会引发异常的可重用函数,请选择带有布尔返回的 validatePrize。如果您仅使用它来检查异常,则使用引发异常的 validatePrize。在这种情况下,我会说抛出异常的 validatePrize 会更合适,因为它可以用于从类本身外部进行异常处理。
这完全取决于。
首先,validatePrize
听起来不像布尔方法,所以 IMO 它不应该返回任何东西。
如果你有一堆保护子句,抛出一个异常。如果您需要在整个应用程序中验证相同的属性集合,请将其设为方法——但该方法也可以用作保护的一部分。
由于您已经知道负值是无效参数,因此您可以通过执行以下操作来防止它:
if(val < 0)
{
return false;
}
我在书中读到,防范这种情况是最好的方法。它不符合或不符合“例外标准”。所以是的,我只会返回一个布尔值。
有些人喜欢抛出异常,但这取决于你。
如果您确实将检查委托给一个方法,您也可以直接从该方法抛出一个异常,以避免构造函数中的代码混乱。这是番石榴使用的典型方法Preconditions
:
this.value = Preconditions.checkNotNull(value, "value must not be null");
如果参数为空,此行将抛出带有关联消息的 NullPointerException。如果参数不为空,则返回允许在一行中检查和分配参数的参数。
如果您有兴趣,代码如下所示:
public static <T> T checkNotNull(T reference, Object errorMessage) {
if (reference == null) {
throw new NullPointerException(String.valueOf(errorMessage));
}
return reference;
}
您可以为您的用例使用类似的方法。
我自己对此的看法是,只有在出现意外情况时才应抛出异常。空指针可以是 this,也可以是 ID 的负数(应始终为正)。基本上,异常用于显示程序内部的问题。如果您只是验证用户的输入,请使用布尔值和测试。