RSS
热门关键字:  数据挖掘  数据仓库  商业智能  人工智能  搜索引擎

实在太难看了,能不能让这段代码好看一点?需要实现相同的功能

来源: 作者: 时间:2008-01-03 点击:

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;
}
}
}
}

数据挖掘实验室


}
}
}
}
}

你只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 { } }
数据挖掘研究院

呃,其实复杂是因为总要try,本来可以这样简单写的:

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 { ... } ...

数据挖掘研究院

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

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

如果我能恰当的处理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+f

ls正解,真牛!

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; } } } } } } } }

同意24楼的说法
在进行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 ......... }
数据挖掘研究院

to   flyingwow99:

后面的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()就是执行不到的。  

没人有好注意么。。。:(

Create By Any-Extract(WL-AE)

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
匿名?