Java的“尝试资源”是否会捕获错误或只是异常?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我有一些junit测试会创建一些资源,这些资源也应该关闭。

实现这一逻辑的一种方法是使用@Before@After方法。

我所做的就是将创作封装在一些实用程序类中以便重用。例如:

class UserCreatorTestUtil implements AutoClosable {
  User create() {...}
  void close() {...}
}

整个目标是让对象自己关闭,而不是需要记住关闭它@After

用法应该是:

@Test
void test() {
  try (UserCreatorTestUtil userCreatorTestUtil = new UserCreatorTestUtil()) {
    User user = userCreatorTestUtil.create();
    // Do some stuff regarding the user's phone
    Assert.assertEquals("123456789", user.getPhone());
  }
}

问题是junit的assert关键字抛出Error- not Exception

尝试与资源“捕捉” Error调用close方法吗?

提问于
用户回答回答于
用户回答回答于

一个基本的尝试与资源声明的伪代码是(cf Java Language Specification §14.20.3.1):

final VariableModifiers_minus_final R Identifier = Expression;
Throwable #primaryExc = null;

try ResourceSpecification_tail
    Block
catch (Throwable #t) {
    #primaryExc = #t;
    throw #t;
} finally {
    if (Identifier != null) {
        if (#primaryExc != null) {
            try {
                Identifier.close();
            } catch (Throwable #suppressedExc) {
                #primaryExc.addSuppressed(#suppressedExc);
            }
        } else {
            Identifier.close();
        }
    }
}

扫码关注云+社区