当前位置: 首页 > 知识库问答 >
问题:

在不声明变量的情况下尝试使用资源

牟星火
2023-03-14

我想使用try with resource来切换上下文,但try()似乎无法在不声明变量的情况下使用资源,这使得代码不那么优雅。例如

class SwitchContext implements Closeable {
   public SwitchContext(String newContext) {
     //Set new context to local thread
   }

   public void close() {
     //Restore old context to local thread
   }

和用法:

String func() {
  try (new SwitchContext(newContext)) {
     //Do something
     return "dummy";
  }

void func2() {
  try (new SwitchContext(newContext)) {
     //Do something
  }

但是我在try()上得到了Syntext错误。只有当我这样写的时候:try(SwitchContext c=new SwitchContext(newContext)){它通过编译。最优雅的方法是什么?

最新消息

因为在一些答案中,人们不明白我想做什么,所以我会尝试更好地解释。我试图以一种更优雅的方式实现以下逻辑:

void func() {
   Context old = ContextUtil.getCurrentContext();
   try() {
       ContextUtil.setContext(A)
       //Do something or call other methods
       //Any method than need the context use ContextUtil.getCurrentContext()
   } finally () {
      ContextUtil.setContext(old)
   }
}

共有2个答案

钱嘉致
2023-03-14

try with resources语句是声明一个或多个资源的try语句

来自Oracle教程。

长话短说:一种语言的语法就是它是什么。当语言要求声明时,您必须在代码中添加声明。

或者,当你想要正式的东西时,看看JLS:

TryWithResourcesStatement:
try ResourceSpecification Block [Catches] [Finally]

ResourceSpecification:
( ResourceList [;] )

ResourceList:
Resource {; Resource}

Resource:
LocalVariableDeclaration
VariableAccess
VariableAccess:
ExpressionName
FieldAccess
卫骏
2023-03-14

new命令返回对新实例化对象的引用。您的代码尝试将放弃该引用。因此,您要遵循的任何代码都无法访问实例化的资源对象。创建一个不能使用的资源对象是没有意义的。

解决方案是创建一个引用变量,我们可以在其中捕获新创建的资源对象的引用。

String func() {
    try (
        SwitchContext context = new SwitchContext( newContext ) ;
    ) {
    // Do something with that resource.
    String result = context.calculate() ;
    return result ;
}
// At this point, `SwitchContext#close` has been called and executed, closing our resource object. 

你评论道,“

在Java的更高版本中,您的资源试用可以访问并自动关闭先前实例化的资源。

SwitchContext context = new SwitchContext( newContext ) ;
… more code …
String func() {
    try (
       context
    ) {
    // Do something with that resource.
    String result = context.calculate() ;
    return result ;
}
// At this point, `SwitchContext#close` has been called and executed, closing our resource object. 

请记住,使用try with resources的全部要点是让JVM自动调用资源“close。如果您无意调用close,请在代码中使用不同的控制流结构。

 类似资料:
  • 考虑以下情况: 在这种情况下,在try资源中创建了三个资源:连接、语句和结果集。 try块结束后,这三种资源会发生什么变化?即使它们没有任何引用,它们都会被关闭吗?还是只会关闭结果集? 在尝试使用资源块时声明资源而不引用它们是否安全?

  • 问题内容: 最近有人问我这在python中是什么意思: 我不知道。我以前从未见过。我检查了文档,没有类似的东西。一个人的建议是它是静态类型声明,但是在文档中也绝对没有任何内容。 有了以上,如果我 失败了 如果我可以,并且type(char)的结果是。但是它不能是静态声明,因为我可以并且type(char)变为。 所以我来这里是为了收集许多SO霸主的智慧。这意味着什么? 问题答案: 您正在查看变量的

  • let和const是JavaScript里相对较新的变量声明方式。 像我们之前提到过的,let在很多方面与var是相似的,但是可以帮助大家避免在JavaScript里常见一些问题。 const是对let的一个增强,它能阻止对一个变量再次赋值。 因为TypeScript是JavaScript的超集,所以它本身就支持let和const。 下面我们会详细说明这些新的声明方式以及为什么推荐使用它们来代替v

  • 问题内容: 我偶然发现了一个奇怪的问题,下面的代码无法编译: 错误(代码是linter推荐的代码)。: 注意,确实使用了该变量。 但是,如果我添加了else块-一切都会按预期编译: 这看起来像是编译器中的错误,还是一个已知问题?任何想法?(我正在使用go 1.11) 编辑:到目前为止的所有被告。按照:https : //golang.org/ref/spec#Short_variable_decl

  • 【资源使用】页面展示具体的资源使用信息,主要包括以下几个方面: 总资源查看 “总资源数”表示该次资源检测过程中,UWA所检测到的资源文件总量。点击“总资源数”,即可查看具体的资源名称、资源类型和所属的AssetBundle文件。目前,我们列出了项目的主要资源类型,您可以通过选择不同的类型来查看相应的资源文件。 上图表格中的每一行,我们均展示了资源与AssetBundle的具体从属关系。同时,您可以

  • 由于Java9,我们可以有效地使用最终变量与资源。 下面的示例显示了一种情况,其中一个资源初始化引发异常。 当我运行这个示例时,我得到的唯一输出是RuntimeException,这意味着Resource1没有关闭。这是意料之中的,因为它没有在try with resources中初始化。 但是,这是预期的结果,还是我遗漏了什么? 因为,如果这实际上是它应该工作的方式,那么在我看来,这种新语法实际