try {
saveDisk();
} finally {
try {
mDelLogStmt.close();
} finally {
try {
mUpdateWorkingStmt.close();
} finally {
try {
mDataStmt.close();
} finally {
try {
mShareSearcher.destroyShareObj();
} finally {
try {
mw.close();
} finally {
try {
mMemDir.close();
} finally {
try {
mDiskDir.close();
} finally {
mDiskDir=null;
mMemDir=null;
mw= null;
mShareSearcher= null;
mDataStmt=null;
mUpdateWorkingStmt=null;
mDelLogStmt=null;
}
}
}
}
}
}
}
}
}

解决方案 »

  1.   

    你只try不 catch? 可以把所有操作放到一个try{ 1,2,3,4}
    然后catch (ex1) {} catch(ex2){} ....finally {destroy1,destroy2}
      

  2.   

    不需要catch
    按照你的写法,问题就是destroy1如果出了异常,destroy2就执行不到我这里没有1,2,3,4,只有destroy1,destroy2,
      

  3.   

    呵呵,是够复杂的啊,不知道这种做法行不行://用位描述每个需要清除的东西,伪代码描述如下:
    mask = ...;
    while( mask > 0 ) {
       try {
          if( (mask & SAVE_DISK)>0 ) {
             mask = mask - SAVE_DISK;
             SaveDisk();
          }
          if( (mask & DEL_LOGSMT)>0 ) {
             mask = mask - DEL_LOGSMT;
             mDelLogStmt.close();
          }
          ...
       } finnaly {
       }
    }
      

  4.   

    呃,其实复杂是因为总要try,本来可以这样简单写的: mDelLogStmt.close();
    mUpdateWorkingStmt.close();
    mDataStmt.close();
    mShareSearcher.destroyShareObj();
    mw.close();
    mMemDir.close();
    mDiskDir.close();但就是担心前面的出了异常,后面的执行不到
      

  5.   

    ltc_mouse的写法好看一点,但更复杂。而且,必须要catch,并处理掉异常,这就和要求有点差距。
      

  6.   

    直接在方法名后面抛出可能发生异常的类型,代码里就不需要 try-catch-finally 了
      

  7.   

    看样子,对每个进行try是不可避免了,不过似乎可以不用嵌套吧try {
       mDelLogStmt.close(); 
    } catch {
       //异常处理
       ...
    }
    //接着关闭其他
    try {
       mUpdateWorkingStmt.close();
    } catch {
       ...
    }
    ...
      

  8.   

    貌似必须嵌套,因为catch后,流程可能就停掉了,后面的try不会被执行.我曾经看到过几个高人在争论java和c++中关闭连接的问题,其中java中最好的关闭方法就是try嵌套,虽然很丑,但是没办法.......
      

  9.   

    finally好象也不可取啊,因为在不抛出的情况下,连接是不关闭的.......finally一定会执行,就一定会被关闭,而且finally中的模块也是可能出错的............
      

  10.   

    如果我能恰当的处理catch,是可以不嵌套。
    但一般来讲,我不想处理这些异常,只是try ... finally, 所以可能就不得不嵌套。
    事实上,发生的异常是被自动抛出了。(如果发生多个异常,不知哪一个异常被抛出...)哎,真的是很丑陋。c++其实也存在同样的问题。
      

  11.   

    呃?为什么说finally不可取?不抛出,连接就不关闭,怎么理解?其实我这儿的问题是通常性的讲,并非是专门针对联接的。就是在对象生命周期结束的时候,需要关闭所有打开资源,为了确保所有资源关闭(即使发生异常也要尽可能关闭所有资源),所以必须一次一次的try...finally当然,数据库访问可以是一个有代表性的例子(相似,当有些不一样):
    connection=getConnection();
    try{
    statement=connection.preparestatement();
    try{
    resultset=statement.executequery();
    try{
    //...
    }finally{
    resultset.close();
    }
    }finally{
    statement.close();
    }
    }finally{
    connection.close();
    }
      

  12.   

    finally中也可能存在异常啊.......如果finally出现异常被抛出了.........代码还是执行不完...............
      

  13.   

    没事啊,
    finally中也try的,出了异常就继续finally
      

  14.   

    不好意思,名字看混了,你这样执行是能执行完的,但finally似乎没catch灵活啊.......一个是一定执行,一个是未必执行..........拜一个先,偶也是新手的说..............
      

  15.   

    这里是否catch不重要。因为我并不关心异常。
    关键是要finally,因为我只关心它一定执行。
      

  16.   

    呃,这儿全是close()调用,不做其他事情的。还怎么分解成小方法?不明白:(
      

  17.   

    所有对象的close方法放在最后一起执行,可以吗?
    对每个对象进行为null的判断,不为null再进行close方法调用。
      

  18.   

    把方法分解指的是整个方法,不是指分解close
      

  19.   

    其实我这段代码是放在finalize()里面的:在对象生命周期结束的时候,确保关闭所有资源(数据库,文件等等)。所以应该没有什么好分解的吧?这儿仅仅就是关闭资源的代码。
      

  20.   

    目前的代码如下,真是够难看了。(已经使用ctrl+shift+f) public void close() throws IOException, SQLException {
    try {
    saveDisk();
    } finally {
    try {
    mDelLogStmt.close();
    } finally {
    try {
    mUpdateWorkingStmt.close();
    } finally {
    try {
    mDataStmt.close();
    } finally {
    try {
    mShareSearcher.destroyShareObj();
    } finally {
    try {
    mw.close();
    } finally {
    try {
    mMemDir.close();
    } finally {
    try {
    mDiskDir.close();
    } finally {
    mDiskDir= null;
    mMemDir= null;
    mw= null;
    mShareSearcher= null;
    mDataStmt= null;
    mUpdateWorkingStmt= null;
    mDelLogStmt= null;
    }
    }
    }
    }
    }
    }
    }
    }
      

  21.   

    同意24楼的说法
    在进行close操作前对需要进行close操作的对象先进行判断,可以关闭才关这样是否会更好些?
      

  22.   

    其实俺本来就是ctrl+shift+f了的,只不过最开始的贴子没有插入java-code。另外,这里的问题,不是空指针异常,所以判断是否为null,没有意义的。即使不为null,其close()方法仍旧可能会产生异常。(我最后设置为null,也只是示意,没有很大的意义)
      

  23.   

    可以设定几个标志位嘛
    bitset<> flag;try {
     //在此每做一个重要步骤,置相应的标志位
     xxxxxxx;
     flag.set
     xxxxxxxx;
     flag.set()
     xxxxxxxx;
     flag.set()
    }catch {
     
    }finally {
     //在此检测有无置标志位
     if (flag.test()) xxxxxxx
     if (flag.test()) xxxxxxx
     .........
    }
      

  24.   

    to flyingwow99:后面的finally没法写。
    这里的xxxx其实就是x.close()
    假设执行顺序是x1.close();x2.close();而x1.close()如果抛出异常,则x2.close()将永远执行不到。
      

  25.   

    try {
        saveDisk();
        mShareSearcher.destroyShareObj();
    } catch (Exception ex) {} finally {
        mDelLogStmt.close();
        mUpdateWorkingStmt.close();
        mw.close();
        mMemDir.close();
        mDiskDir = null;
        mMemDir = null;
        mw = null;
        mShareSearcher = null;
        mDataStmt = null;
        mUpdateWorkingStmt = null;
        mDelLogStmt = null;}这样不行吗?
    你只是要它执行就可以了啊`。
      

  26.   

    汗,这样当然不行,
    如果saveDisk()抛出异常,则mShareSearcher.destroyShareObj()就是执行不到的。