Java try with resource 难受

2020 年 9 月 30 日
 cheneydog

之前把 try 都改成了 java try with resource 形式。现在有新需求,发现无法实现,难道又要改回来?

try( Handler api = getHandler() ) {
    // 做点啥
    api.getState();
    
} catch ( Exception e ){
    log.error("getState {} 时异常 {}", api, e);
    
    // [看这里]  我想要在执行出错的情况下多做一步操作,api 这个对象竟然没法访问到!!!
    api.markDirty();
} 

请教,如果我要在异常的情况下多做一点操作, java try with resource 形式是不是就没法写了???

那也太鸡肋了。。。

2004 次点击
所在节点    问与答
12 条回复
ChenFanlin
2020 年 9 月 30 日
emmm 第一直觉是在里面再套个 try catch 来执行
glasslion
2020 年 9 月 30 日
api 定义移到外面去不就行了
xiangyuecn
2020 年 9 月 30 日
try( Handler api = getHandler() ) {

}

这才是真正的 try with resource,科学点:

using( Handler api = getHandler() ){

}


啥也不是:
try(xxx){}catch(){}
lxk11153
2020 年 9 月 30 日
链接: https://juejin.im/post/6844903517086285837
> 在 Java 7 中,try-with-resouces 语法要求为每一个资源声明一个新的变量,而且这些资源由 try-with-resources 语句进行管理。
> 在 Java 9 中:如果一个资源被 final 或者等效于 final 变量引用,则在不需要声明一个新的变量的情况下,try-with-resources 就可以管理这个资源。
keenkiller
2020 年 9 月 30 日
不是。。。你这把 try 的两种用法混合双打?
ebony0319
2020 年 10 月 1 日
好像继承 Closeable 接口,然后重写 close 方法即可。你这种情况只需要重写 close 方法。
cheneydog
2020 年 10 月 1 日
@ebony0319 close 永远被执行,我哪里知道有没有发生异常呢?
cheneydog
2020 年 10 月 1 日
@lxk11153 暂时还没法用 jdk9
cheneydog
2020 年 10 月 1 日
@xiangyuecn 看不懂
lxk11153
2020 年 10 月 1 日
@cheneydog #8 楼层 2 不是已经说了吗?
```java
Handler api;
try( Handler _api = (api=getHandler()) ) {
} catch (Exception e) {
api.markDirty();
}
```
lxk11153
2020 年 10 月 1 日
还是这样吧:
```java
Handler api = getHandler();
try( Handler _api = api ) {
} catch (Exception e) {
api.markDirty();
}
```
javapythongo
2020 年 10 月 1 日
在 finaly 手动 close 就是了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/711957

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX