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;
}
}
}
}
}
}
}
}
}
你只try不 catch?
可以把所有操作放到一个try{ 1,2,3,4}
然后catch (ex1) {} catch(ex2){} ....
finally {destroy1,destroy2}
不需要catch。。。
按照你的写法,问题就是destroy1如果出了异常,destroy2就执行不到。。。
我这里没有1,2,3,4,只有destroy1,destroy2,。。。呵呵,是够复杂的啊,不知道这种做法行不行:
- Java code
- //用位描述每个需要清除的东西,伪代码描述如下: 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 { } }数据挖掘研究院
mDelLogStmt.close();
mUpdateWorkingStmt.close();
mDataStmt.close();
mShareSearcher.destroyShareObj();
mw.close();
mMemDir.close();
mDiskDir.close();
但就是担心前面的出了异常,后面的执行不到。。。ltc_mouse的写法好看一点,但更复杂。而且,必须要catch,并处理掉异常,这就和要求有点差距。直接在方法名后面抛出可能发生异常的类型,代码里就不需要 try-catch-finally 了晕,那前一句出了异常,后面的不是运行不到了?这不行啊。牛...呃,很想不这样“牛”啊看样子,对每个进行try是不可避免了,不过似乎可以不用嵌套吧
- Java code
- try { mDelLogStmt.close(); } catch { //异常处理 ... } //接着关闭其他 try { mUpdateWorkingStmt.close(); } catch { ... } ...
但一般来讲,我不想处理这些异常,只是try ... finally, 所以可能就不得不嵌套。
事实上,发生的异常是被自动抛出了。(如果发生多个异常,不知哪一个异常被抛出...)
哎,真的是很丑陋。c++其实也存在同样的问题。呃?为什么说finally不可取?不抛出,连接就不关闭,怎么理解?
其实我这儿的问题是通常性的讲,并非是专门针对联接的。
就是在对象生命周期结束的时候,需要关闭所有打开资源,为了确保所有资源关闭(即使发生异常也要尽可能关闭所有资源),所以必须一次一次的try...finally
当然,数据库访问可以是一个有代表性的例子(相似,当有些不一样):
- Java code
- connection=getConnection(); try{ statement=connection.preparestatement(); try{ resultset=statement.executequery(); try{ //... }finally{ resultset.close(); } }finally{ statement.close(); } }finally{ connection.close(); }数据挖掘实验室
finally中也可能存在异常啊.......如果finally出现异常被抛出了.........代码还是执行不完...............没事啊,
finally中也try的,出了异常就继续finally不好意思,名字看混了,你这样执行是能执行完的,但finally似乎没catch灵活啊.......一个是一定执行,一个是未必执行..........拜一个先,偶也是新手的说..............这里是否catch不重要。因为我并不关心异常。
关键是要finally,因为我只关心它一定执行。晕,我觉得你不应该在这里钻牛角尖了
换个思路,你应该尝试把方法分解成几个小方法呃,这儿全是close()调用,不做其他事情的。还怎么分解成小方法?不明白。。。:(ctrl+shift+fls正解,真牛!19楼所有对象的close方法放在最后一起执行,可以吗?
对每个对象进行为null的判断,不为null再进行close方法调用。
把方法分解指的是整个方法,不是指分解close其实我这段代码是放在finalize()里面的:在对象生命周期结束的时候,确保关闭所有资源(数据库,文件等等)。
所以应该没有什么好分解的吧?这儿仅仅就是关闭资源的代码。扶我一下,我要晕~倒了,支持21楼,哈目前的代码如下,真是够难看了。(已经使用ctrl+shift+f)
- Java code
- 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; } } } } } } } }
在进行close操作前对需要进行close操作的对象先进行判断,可以关闭才关
这样是否会更好些?其实俺本来就是ctrl+shift+f了的,只不过最开始的贴子没有插入java-code。
另外,这里的问题,不是空指针异常,所以判断是否为null,没有意义的。即使不为null,其close()方法仍旧可能会产生异常。(我最后设置为null,也只是示意,没有很大的意义)这样的问题其实俺经常遇到,特别郁闷:
在一段代码结束以后,总要清理现场的,为了确保尽量清理干净,就不得不如此一层一层嵌套。实在难看得很。可以设定几个标志位嘛
- C/C++ code
- bitset<> flag; try { //在此每做一个重要步骤,置相应的标志位 xxxxxxx; flag.set xxxxxxxx; flag.set() xxxxxxxx; flag.set() }catch { }finally { //在此检测有无置标志位 if (flag.test()) xxxxxxx if (flag.test()) xxxxxxx ......... }数据挖掘研究院
后面的finally没法写。
这里的xxxx其实就是x.close()
假设执行顺序是x1.close();x2.close();
而x1.close()如果抛出异常,则x2.close()将永远执行不到。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;
}
这样不行吗?
你只是要它执行就可以了啊`。汗,这样当然不行,
如果saveDisk()抛出异常,则mShareSearcher.destroyShareObj()就是执行不到的。 没人有好注意么。。。:(

