Java 中的异常规范有什么好处?

What's the benefit of exceptions specification in Java?

本文关键字:什么 异常 Java      更新时间:2023-10-16

我是从c++来到Java的。在Java和c++中,我们都可以指定异常。它看起来像这样:

void function_name() throw(Exception)
{
  ...
  if (error) 
  {
    throw Exception("Error");
  }
  ...
}

据我所知,在c++中编写异常规范被认为是一种不好的做法。与c++不同,在Java中我们必须这样做。所以,我的问题是:

在Java中编写异常规范的好处是什么?

您必须在方法签名中只指定检查异常(Exception类的子类)。不需要指定未检查的异常(RuntimeException类的子类)。

在方法签名中指定异常是由语言语义定义的固有Java实践。但关于它也有很多争议。有些团队和项目甚至认为这是一个不好的实践,只使用未检查的异常。

一般来说,作为一个好的实践,当你将检查异常定义为方法契约的一部分时,你应该抛出一个检查异常,也就是说,方法调用者必须意识到一些特定的(非常可能和可恢复的)错误类型,要么捕获并处理它,要么将它传递到调用堆栈。未检查的异常通常表示方法代码中存在一些内部错误,因此不需要捕获。

Java中没有利润,异常规范是强制性的。Java被设计成比c++更强的类型系统。在c++中,异常规范是可选的,Java设计者认为异常是程序设计的重要组成部分,因此他们决定在函数可能抛出异常时强制执行异常规范。这有时是有争议的,但这是一种语言设计选择。异常是调用契约的一部分。