3

在异常处理的情况下,我有一个关于 java 标准的查询。

代码片段:

public String methodXXX(){
//This method may throw IllegalArgumentexception and arrayoutofboundaryException.
}

在这种情况下,哪个是好的编码标准,请告诉我为什么 case1:

public String methodXXX() throw IllegalArgumentexception,ArrayoutofBoundaryException.{
//This method may throw IllegalArgumentexception and arrayoutofboundaryException.
}

案例2:

public String methodXXX()throws Exception{
//This method may throw IllegalArgumentexception and arrayoutofboundaryException.
}

为什么我在这里提到case2是:我们可能不会期望在运行时会发生其他异常。由于 Exception 是所有异常的父类,因此情况 2 更可取 ??? 如果是,在哪些情况下 case1 是可行的?你能解释一下你的表现吗?

4

4 回答 4

2

声明方法抛出的特定异常总是更好。这不仅可以更清楚地说明可能发生的问题,而且可以在必要时更轻松地单独处理它们。

实际上并没有任何性能影响:为异常创建堆栈跟踪是如此昂贵的操作,以至于它使所有其他考虑相形见绌。

于 2012-04-27T02:56:39.083 回答
1

我认为您不应该抛出异常,而是将其放在 java doc 注释中。这样,您的 api 用户就知道可能发生什么样的异常,并且不会被迫捕获这些异常。

/**
 * @throws IllegalArgumentexception
 * @throws ArrayoutofBoundaryException
 */
public String methodXXX() {
  //This method may throw IllegalArgumentexception and arrayoutofboundaryException.
}

我更喜欢运行时异常而不是检查异常,因为大多数情况下强制捕获异常不会有太大帮助。因此,将所有异常放在 java doc 中也可以清楚地说明,并且不会强制捕获它。这样代码更干净,并且默认情况下有可能将异常传播到顶层。否则,我看到许多开发人员只是捕获检查的异常而不做任何事情,使顶层不知道发生在较低层的任何异常。

规则的一般经验是“如果用户可以从异常中恢复,则抛出检查异常,否则记录运行时异常”即使这样,我也更喜欢后者,因为检查异常通常不是很有帮助。

于 2012-04-27T04:23:50.227 回答
1

这两个异常都是RuntimeException子类,您不必throws在方法声明的部分显式声明它们。

在 Java 中有两种异常:checked 和 unchecked。正如链接中所解释的,每一个都在不同的情况下使用。作为其子类的所有异常RuntimeException都是未经检查的异常,通常您不应该声明方法抛出它们。

于 2012-04-27T02:57:24.803 回答
1

通常,RuntimeExceptions 喜欢IllegalArgumentExceptionArrayIndexOutOfBoundsException反映程序员错误,而不是最终程序应该知道如何在运行时处理的异常。

通常,不值得显式声明RuntimeExceptions,因为响应此类异常的正确方法通常是直接抛出,因此运行程序的程序员知道有需要修复的错误,并且可以获得堆栈跟踪。try/catch编写捕获 a 的a 通常不是一个好主意RuntimeException,因此没有意义。

对于其他类型的Exceptions,您应该声明可能抛出的特定异常,以便您的方法的用户可以单独捕获它们,并对每种特定的异常类型编写不同的响应。只是声明你正在抛出Exception强制你的方法的用户编写不能做任何智能的异常处理程序,因为他们对抛出的特定异常一无所知。

于 2012-04-27T02:59:02.837 回答