根据Java编码规范的异常处理

3

我有一个关于Java异常处理标准的问题。

代码片段:

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

在这种情况下,哪些是良好的编码标准?请告诉我原因。 案例1:
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是所有异常的父类,所以Case2更可取吗? 如果是的话,在哪些情况下Case1是可行的? 您能否向我解释一下性能方面的观点?


1
抛出异常时一定要明确。 - rid
4个回答

2

声明方法可能抛出的具体异常总是更好的选择。这不仅可以清楚地指出可能发生的问题,而且如果需要单独处理它们,这样做会更容易。

实际上并没有什么性能影响:为异常创建堆栈跟踪是一项非常昂贵的操作,它超越了所有其他考虑因素。


1

我认为你不应该抛出异常,而是将其放在Java文档注释中。这样,您的API用户就知道可能发生什么样的异常,并且不必强制捕获这些异常。

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

我更喜欢使用运行时异常而不是受检异常,因为大多数情况下强制捕获异常并不能帮助太多。因此,在Java文档中放置所有异常可以使其清晰明了,并且不会强制捕获它。这样代码更加简洁,异常传播到顶层的机会也是默认存在的。否则,我看到许多开发人员只是捕获受检异常而不做任何事情,使得顶层不知道底层发生的任何异常。

一般的经验法则是“如果用户可以从异常中恢复,则抛出受检异常,否则记录运行时异常”。即使如此,我仍然更喜欢后者,因为受检异常通常没有太大的帮助。


1

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

在Java中有两种异常:checked and unchecked。如链接所述,每种异常在不同情况下使用。所有RuntimeException的子类异常都是未检查异常,在一般情况下,你不应该声明一个方法会抛出它们。


并不是说你不能这样做,只是你不必这样做。如果你在代码中明确地抛出它们,声明它们仍然是有用的信息。 - Ernest Friedman-Hill

1
通常,像IllegalArgumentExceptionArrayIndexOutOfBoundsException这样的RuntimeException反映了程序员的错误,而不是最终程序在运行时应该知道如何处理的异常。
一般来说,明确声明RuntimeException是没有意义的,因为对这种异常做出正确的响应通常只需要抛出异常,这样运行程序的程序员就知道需要修复的错误,并可以获取堆栈跟踪。捕获RuntimeExceptiontry/catch通常不是一个好主意,因此没有必要这样做。
关于其他类型的Exception,您应该声明可能会抛出的特定异常,以便使用您方法的用户可以单独捕获每个异常并针对每个特定异常类型编写不同的响应。仅声明您正在抛出Exception会强制使用您方法的用户编写无法执行任何智能操作的异常处理程序,因为他们不知道抛出的具体异常信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接