2

当您编写方法时,您几乎总是必须检查必须有效的东西。

假设您需要抛出一个IllegalArgumentException方法的价格参数是否无效。因为我想把我的程序分成小块,所以我为它创建了一个私有方法。但是,最好的做法是创建一个名为类似的方法validatePrize并返回一个布尔值,然后我在 if 语句中检查我调用该validatePrize方法的位置,然后抛出 IllegalArgumentException?

还是该方法不返回任何内容并抛出异常更好?

4

5 回答 5

2

我会说这个问题的答案主要是基于偏好。如果您想要一个在调用时不会引发异常的可重用函数,请选择带有布尔返回的 validatePrize。如果您仅使用它来检查异常,则使用引发异常的 validatePrize。在这种情况下,我会说抛出异常的 validatePrize 会更合适,因为它可以用于从类本身外部进行异常处理。

于 2012-10-27T23:12:51.987 回答
1

这完全取决于。

首先,validatePrize听起来不像布尔方法,所以 IMO 它不应该返回任何东西。

如果你有一堆保护子句,抛出一个异常。如果您需要在整个应用程序中验证相同的属性集合,请将其设为方法——但该方法也可以用作保护的一部分。

于 2012-10-27T23:15:01.173 回答
0

由于您已经知道负值是无效参数,因此您可以通过执行以下操作来防止它:

if(val < 0)
{
  return false;
}

我在书中读到,防范这种情况是最好的方法。它不符合或不符合“例外标准”。所以是的,我只会返回一个布尔值。

有些人喜欢抛出异常,但这取决于你。

于 2012-10-27T23:11:10.740 回答
0

如果您确实将检查委托给一个方法,您也可以直接从该方法抛出一个异常,以避免构造函数中的代码混乱。这是番石榴使用的典型方法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;
}

您可以为您的用例使用类似的方法。

于 2012-10-27T23:13:56.797 回答
0

我自己对此的看法是,只有在出现意外情况时才应抛出异常。空指针可以是 this,也可以是 ID 的负数(应始终为正)。基本上,异常用于显示程序内部的问题。如果您只是验证用户的输入,请使用布尔值和测试。

于 2012-10-27T23:18:26.630 回答