Java编程,在发生错误时返回

时间:2014-06-26 15:03:27

标签: java

我想知道以下用例的最佳编程习惯,例如myMethod -

1)myMethod有一些数字用途 - 比如修改一个数组的内容,这是一个类的私有变量

2)在此之前,我需要对数字运行一些关键检查,比如check1,check2,check3,如果失败,任何一个都没有任何意义。例如。检查可能是检查数组中的任何负数。

所以这带来了一个问题,myMethod应该返回什么,调用函数应该告诉checkX失败了。

8 个答案:

答案 0 :(得分:3)

如果其中任何一项检查失败,您应该抛出Exceptions

现在的问题是抛出什么样的异常。选中还是未选中? Checked Exceptions必须被调用代码捕获,而未调用则不会(但这意味着它们可能会一直冒泡到调用堆栈的顶部直到main方法)。有激烈的辩论更好。无论哪种方式,请确保记录抛出的异常。

通常,您应该对可恢复条件使用已检查的异常,对编程错误使用未经检查的异常(Effective Java 2nd ed Item 58)

Java中有许多内置未经检查的异常,您应该优先使用它们来编写自己的异常,包括但不限于。

IllegalArgumentException IllegalStateException IndexOutOfBoundsException NullPointerException

看看核心Java方法,看看它们扔了什么。

例外优于返回值,因为:

  1. 您必须依赖用户检查返回值并对其采取一些措施。
  2. 你会遇到一个返回布尔值或返回代码的方法签名,这可能不是你想要的。
  3. Exception可以有一个非常描述性的错误消息,解释它被抛出的原因。

答案 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)

这引发了一个关于是否使用异常或错误代码的争论。 你可以在这里阅读更多相关信息:

Exceptions or error codes