课堂上的大括号有什么作用?

Mic*_*zyk 3 java

我有一些其他开发人员编写的类:

public class ManifestFile implements Serializable {

private final static DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
private final static XPathFactory xPathFactory = XPathFactory.newInstance();
private final static DateFormat YYYYMMDD = new SimpleDateFormat("yyyyMMdd");
private final String uuid;
private final Set<File> attachments = new LinkedHashSet<File>();
private final transient ApplicationContext applicationContext = JavaService.INSTANCE.getApplicationContext();
private final transient File attachmentDirectory;
private final Date processAfter = new Date(System.currentTimeMillis() + 3 * 1000 * 60);

{
    try {
        documentBuilderFactory.setNamespaceAware(true);
        final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = sf.newSchema(new StreamSource(getClass().getResourceAsStream("/StrategicEmail5.xsd")));
        documentBuilderFactory.setSchema(schema);
        documentBuilderFactory.setValidating(true);
    } catch (Throwable t) {
        throw new RuntimeException(t);
    }
}
Run Code Online (Sandbox Code Playgroud)

我很惊讶这部分:

{
try {
    documentBuilderFactory.setNamespaceAware(true);
    final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = sf.newSchema(new StreamSource(getClass().getResourceAsStream("/StrategicEmail5.xsd")));
    documentBuilderFactory.setSchema(schema);
    documentBuilderFactory.setValidating(true);
} catch (Throwable t) {
    throw new RuntimeException(t);
}
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释这个代码有效吗?在任何方法体外使用{}有什么好处?

And*_*mas 6

这是一个实例初始化程序块.它被称为类的实例初始化的一部分.

在初始化时,您还可以使用"static"为这样的块添加序列,以便将其调用一次.这称为静态初始化程序.

Java语言规范:

8.6.实例初始化器

在创建类的实例时,将执行类中声明的实例初始值设定项(第12.5节,第15.9节,第8.8.7节)....

  • 如果实例初始化程序无法正常完成,则为编译时错误(第14.21节).
  • 如果返回语句(第14.17节)出现在实例初始值设定项中的任何位置,则为编译时错误.
  • 允许实例初始值设定项通过关键字this(第15.8.3节)引用当前对象,以使用关键字super(第15.11.2节,第15.12节),并在范围内使用任何类型变量.
  • 使用在使用后以声明方式显示声明的实例变量有时会受到限制,即使这些实例变量在范围内也是如此.有关控制实例变量的正向引用的精确规则,请参见§8.3.2.3.

实例初始值设定项的异常检查在第11.2.3节中指定.