V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
cheneydog
V2EX  ›  问与答

Java try with resource 难受

  •  
  •   cheneydog · 2020-09-30 17:31:23 +08:00 · 1294 次点击
    这是一个创建于 1518 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前把 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 形式是不是就没法写了???

    那也太鸡肋了。。。

    12 条回复    2020-10-01 22:55:37 +08:00
    ChenFanlin
        1
    ChenFanlin  
       2020-09-30 17:34:48 +08:00
    emmm 第一直觉是在里面再套个 try catch 来执行
    glasslion
        2
    glasslion  
       2020-09-30 17:37:39 +08:00
    api 定义移到外面去不就行了
    xiangyuecn
        3
    xiangyuecn  
       2020-09-30 17:39:02 +08:00
    try( Handler api = getHandler() ) {

    }

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

    using( Handler api = getHandler() ){

    }


    啥也不是:
    try(xxx){}catch(){}
    lxk11153
        4
    lxk11153  
       2020-09-30 17:41:05 +08:00
    链接: https://juejin.im/post/6844903517086285837
    > 在 Java 7 中,try-with-resouces 语法要求为每一个资源声明一个新的变量,而且这些资源由 try-with-resources 语句进行管理。
    > 在 Java 9 中:如果一个资源被 final 或者等效于 final 变量引用,则在不需要声明一个新的变量的情况下,try-with-resources 就可以管理这个资源。
    tairan2006
        5
    tairan2006  
       2020-09-30 19:21:19 +08:00
    不是。。。你这把 try 的两种用法混合双打?
    ebony0319
        6
    ebony0319  
       2020-10-01 00:00:05 +08:00 via Android
    好像继承 Closeable 接口,然后重写 close 方法即可。你这种情况只需要重写 close 方法。
    cheneydog
        7
    cheneydog  
    OP
       2020-10-01 16:14:01 +08:00
    @ebony0319 close 永远被执行,我哪里知道有没有发生异常呢?
    cheneydog
        8
    cheneydog  
    OP
       2020-10-01 16:15:28 +08:00
    @lxk11153 暂时还没法用 jdk9
    cheneydog
        9
    cheneydog  
    OP
       2020-10-01 16:15:54 +08:00
    @xiangyuecn 看不懂
    lxk11153
        10
    lxk11153  
       2020-10-01 16:29:27 +08:00
    @cheneydog #8 楼层 2 不是已经说了吗?
    ```java
    Handler api;
    try( Handler _api = (api=getHandler()) ) {
    } catch (Exception e) {
    api.markDirty();
    }
    ```
    lxk11153
        11
    lxk11153  
       2020-10-01 16:32:14 +08:00
    还是这样吧:
    ```java
    Handler api = getHandler();
    try( Handler _api = api ) {
    } catch (Exception e) {
    api.markDirty();
    }
    ```
    javapythongo
        12
    javapythongo  
       2020-10-01 22:55:37 +08:00
    在 finaly 手动 close 就是了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3683 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:26 · PVG 12:26 · LAX 20:26 · JFK 23:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.