我想知道以下用例的最佳编程习惯,例如myMethod -
1)myMethod有一些数字用途 - 比如修改一个数组的内容,这是一个类的私有变量
2)在此之前,我需要对数字运行一些关键检查,比如check1,check2,check3,如果失败,任何一个都没有任何意义。例如。检查可能是检查数组中的任何负数。
所以这带来了一个问题,myMethod应该返回什么,调用函数应该告诉checkX失败了。
答案 0 :(得分:3)
如果其中任何一项检查失败,您应该抛出Exceptions
。
现在的问题是抛出什么样的异常。选中还是未选中? Checked Exceptions必须被调用代码捕获,而未调用则不会(但这意味着它们可能会一直冒泡到调用堆栈的顶部直到main方法)。有激烈的辩论更好。无论哪种方式,请确保记录抛出的异常。
通常,您应该对可恢复条件使用已检查的异常,对编程错误使用未经检查的异常(Effective Java 2nd ed Item 58)
Java中有许多内置未经检查的异常,您应该优先使用它们来编写自己的异常,包括但不限于。
IllegalArgumentException
IllegalStateException
IndexOutOfBoundsException
NullPointerException
看看核心Java方法,看看它们扔了什么。
例外优于返回值,因为:
答案 1 :(得分:1)
您可以按如下方式创建自定义检查的例外:
class ArrayModificationException extends Exception{
public ArrayModificationException(String message){
super(message);
}
}
现在在你的“myMethod”中添加以下内容:
void myMethod() throws ArrayModificationException{
//code to check conditions before modifications
//code to modify an array
if(check fails){
throw new ArrayModificationException("cusom message");
}
}
自定义消息将是传达确切失败原因的特定消息。
当然被叫方将决定是否处理它或重新抛出它。如果这是您的代码不应该尝试恢复自身的条件之一,您可以将其设计为运行时异常,并为方法抛出不带throws子句
答案 2 :(得分:0)
这里没有“最佳实践”。它完全取决于你的代码执行的内容,执行的位置,方法调用者的期望,错误情况下应该发生的事情等。上下文是关键。
答案 3 :(得分:0)
一种可能性是从失败的检查中抛出异常,然后在调用方法中捕获该异常。
如果所有检查都通过并且修改/计算完成,则另一个选项是让myMethod返回布尔值true,否则返回false。
正如new_web_programmer所说,这完全取决于你想要做什么。
答案 4 :(得分:0)
通常在验证失败后我会
throw new IllegalArgumentException("... Clue to the error and its repair...");
IllegalStateException是替代方法。
这使得该功能可以在成功时按需继续。
如果必须捕获异常而不传播异常,请使用您自己的异常。
答案 5 :(得分:0)
try{
check1
}catch(Exception e){
throw new CustomException("failed due to check1");
}
这样的事情可能是更好的做法。
答案 6 :(得分:0)
如果预计检查失败是特殊情况,则抛出异常。很好的例子是如果参数为null但不允许null,或者数组索引超出范围。
如果您的函数应该根据输入返回一个合理的值,例如将Point clisest返回到0,0那么您可以根据检查失败返回一个合理的值。例如,如果Points数组为空,或者数组本身为null,则返回null。
在任何情况下,请务必清楚地记录(在方法' s javadoc中)哪些输入会导致失败以及预期的行为是什么,这样您的来电者就不会感到惊讶。
答案 7 :(得分:0)
这引发了一个关于是否使用异常或错误代码的争论。 你可以在这里阅读更多相关信息: