抛出异常或 return 一个值
Throw exception or return a value
我的问题很简单。
我有一个名为 Triangle 的 class。这个class有个方法;
public boolean isAnyAngleGreaterThan(double deg);
我的问题如下:
如果 'deg' 不在 0 < 'deg' < 180 范围内,我应该抛出 illegalArgumentException 还是应该 return TRUE 如果 deg <= 0 , 如果 deg >= 180?
则为 FALSE
或者哪一个是最优选的?
1
public boolean isAnyAngleGreaterThan(double deg) {
if (Double.compare(0, deg) >= 0) {
throw new IllegalArgumentException("Angle (deg) can't be negative.");
} else if (Double.compare(180, deg) <= 0) {
throw new IllegalArgumentException("Angle (deg) can't be greater or equal than 180.");
}
return Double.compare(aDeg, deg) > 0
|| Double.compare(bDeg, deg) > 0
|| Double.compare(cDeg, deg) > 0;
}
2
public boolean isAnyAngleGreaterThan(double deg) {
return Double.compare(aDeg, deg) > 0
|| Double.compare(bDeg, deg) > 0
|| Double.compare(cDeg, deg) > 0;
}
其中 'aDeg'、'bDeg' 和 'cDeg' 是三角形中的角 a、b 和 c。
一般规则是:不要使用异常作为流程控制。
因此:
如果该方法的结果导致其他结果然后抛出异常,那么您应该 return boolean
.
如果此方法的结果用于查明是否需要抛出异常,则该方法本身可以抛出异常(应该是 void
)。
就个人而言,您的函数暗示了一项基本检查 - 三角形的角度是否大于参数。这并不是说对角度有限制,因此应该只有 return 一个 true
/ false
值。但是,如果使用用户定义的参数调用此函数,那么它可能会使验证/错误反馈更容易 return 表明参数无效的异常。
这确实是您的语义/个人喜好的问题。这实际上取决于您希望函数执行的操作。
如果度数小于或等于 0,你可能会抛出 IllegalArgumentException
,如果度数大于 180,你可能会抛出 return false。
前者的原因是多边形的角度在数学意义上总是正的。后者的原因是多边形的角度可能大于180,当然不是三角形,但在一般数学意义上,角度大于180度是有效的。
我从对象的名称推测这个对象是用来表示一个三角形的。因此,它将驻留在您的代码区域中,该区域通常称为 model
,通常包含系统状态。
因此,我几乎从不在此处执行有效性检查。参数验证应尽可能在最浅层进行,即尽可能靠近值为 entered/read 的位置。这是 Fail Fast 范式。
这是一个核心对象。它不应该负责参数检查,正如它不应该负责访问结果的安全性或结果的加密 returns.
只有在某些参数可能会导致其他问题时才应验证模型代码中的参数。在您的情况下,因为您要比较的是其他 double
值,那么应该没有任何问题。
例如,如果要执行某些可能导致异常(例如除以零)或其他不良影响的计算,那么在这种情况下 Fail Fast
和检查零值并抛出异常。
我的问题很简单。 我有一个名为 Triangle 的 class。这个class有个方法;
public boolean isAnyAngleGreaterThan(double deg);
我的问题如下:
如果 'deg' 不在 0 < 'deg' < 180 范围内,我应该抛出 illegalArgumentException 还是应该 return TRUE 如果 deg <= 0 , 如果 deg >= 180?
则为 FALSE或者哪一个是最优选的?
1
public boolean isAnyAngleGreaterThan(double deg) {
if (Double.compare(0, deg) >= 0) {
throw new IllegalArgumentException("Angle (deg) can't be negative.");
} else if (Double.compare(180, deg) <= 0) {
throw new IllegalArgumentException("Angle (deg) can't be greater or equal than 180.");
}
return Double.compare(aDeg, deg) > 0
|| Double.compare(bDeg, deg) > 0
|| Double.compare(cDeg, deg) > 0;
}
2
public boolean isAnyAngleGreaterThan(double deg) {
return Double.compare(aDeg, deg) > 0
|| Double.compare(bDeg, deg) > 0
|| Double.compare(cDeg, deg) > 0;
}
其中 'aDeg'、'bDeg' 和 'cDeg' 是三角形中的角 a、b 和 c。
一般规则是:不要使用异常作为流程控制。
因此:
如果该方法的结果导致其他结果然后抛出异常,那么您应该 return
boolean
.如果此方法的结果用于查明是否需要抛出异常,则该方法本身可以抛出异常(应该是
void
)。
就个人而言,您的函数暗示了一项基本检查 - 三角形的角度是否大于参数。这并不是说对角度有限制,因此应该只有 return 一个 true
/ false
值。但是,如果使用用户定义的参数调用此函数,那么它可能会使验证/错误反馈更容易 return 表明参数无效的异常。
这确实是您的语义/个人喜好的问题。这实际上取决于您希望函数执行的操作。
如果度数小于或等于 0,你可能会抛出 IllegalArgumentException
,如果度数大于 180,你可能会抛出 return false。
前者的原因是多边形的角度在数学意义上总是正的。后者的原因是多边形的角度可能大于180,当然不是三角形,但在一般数学意义上,角度大于180度是有效的。
我从对象的名称推测这个对象是用来表示一个三角形的。因此,它将驻留在您的代码区域中,该区域通常称为 model
,通常包含系统状态。
因此,我几乎从不在此处执行有效性检查。参数验证应尽可能在最浅层进行,即尽可能靠近值为 entered/read 的位置。这是 Fail Fast 范式。
这是一个核心对象。它不应该负责参数检查,正如它不应该负责访问结果的安全性或结果的加密 returns.
只有在某些参数可能会导致其他问题时才应验证模型代码中的参数。在您的情况下,因为您要比较的是其他 double
值,那么应该没有任何问题。
例如,如果要执行某些可能导致异常(例如除以零)或其他不良影响的计算,那么在这种情况下 Fail Fast
和检查零值并抛出异常。