- 在线时间
- 0 小时
- 最后登录
- 2007-11-17
- 注册时间
- 2005-1-15
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 1102 点
- 威望
- 0 点
- 阅读权限
- 40
- 积分
- 400
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 132
- 主题
- 85
- 精华
- 0
- 分享
- 0
- 好友
- 0
升级   33.33% 该用户从未签到
 |
反例之六:输出数据不完整 <BR><BR>代码:7行-11行。 <BR><BR>不完整的数据是Java程序的隐形杀手。仔细观察这段代码,考虑一下如果循环的中间抛出了异常,会发生什么事情。循环的执行当然是要被打断的,其次,catch块会执行??就这些,再也没有其他动作了。 <BR><BR>已经输出的数据怎么办?使用这些数据的人或设备将收到一份不完整的(因而也是错误的)数据,却得不到任何有关这份数据是否完整的提示。对于有些系统来说,数据不完整可能比系统停止运行带来更大的损失。 <BR><BR>较为理想的处置办法是向输出设备写一些信息,声明数据的不完整性;另一种可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一次性输出。 <BR><BR>结论六:全面考虑可能出现的异常以及这些异常对执行流程的影响。 <BR><BR>改写后的代码 <BR><BR>根据上面的讨论,下面给出改写后的代码。也许有人会说它稍微有点?嗦,但是它有了比较完备的异常处理机制。 <BR><BR>
" K/ V7 m4 r7 `& N5 k* } F0 [<CENTER><CCID_NOBR>* @4 B$ K. u* H2 O; ?/ x
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
5 t) ] V0 h6 P) @5 N# b; h" C: H
6 a: q4 g( O2 P* E N2 r8 y<TR>5 p4 E9 _/ ]2 \0 {0 C/ Y) k
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>< RE><CCID_CODE>OutputStreamWriter out = ...5 Y. v6 H8 F* r& M6 p/ B
java.sql.Connection conn = .... y4 R( Z' x* h% N+ E
try {* S" J8 p3 p, w7 N
Statement stat = " ^2 t/ G7 N( \4 r
conn.createStatement();
* t1 ^8 _% k+ Y ResultSet rs = stat.executeQuery2 i' I2 |3 V' W N/ J1 l$ d
("select uid, name from user");! F. v8 ]$ |$ V Z: f7 j0 l( _
while (rs.next())
" V) d& N4 f' d' y0 q! b" I( h {
. N; o1 I* Z1 @- }' T8 V9 d8 b: `: V out.println("ID:" +
2 T- I9 I. d4 v: srs.getString("uid") + ",姓名: "; x f, L; S. B3 c" K
+ rs.getString("name"));
( W, R; k: K. M- i }* E; y" c6 E: r! ]
}
) m* h9 M: k0 a' a$ M! F! t catch(SQLException sqlex)* q' s6 Q0 ^3 O+ l
{
- V: {/ g) N. a' L- N- h! x out.println("警告:数据不完整");4 L9 L5 o! h* x b! \! x8 o
throw new ApplicationException
. ?! l1 c4 j( l, K- u4 \4 ?("读取数据时出现SQL错误", sqlex);
% ?. Y0 q( L! |+ M }
3 e( ^+ f ~, q2 Q1 l$ z# M catch(IOException ioex)9 C6 j6 b. P" L" t* M4 i$ f
{
( s) w( ^& M" r1 L) S8 j throw new ApplicationException
4 y0 [0 j! s, O% \" F% X) H("写入数据时出现IO错误", ioex);
$ \, n2 ?. a3 K }
O' Z7 F% Z% n$ T# Y8 X finally3 _) h/ ]8 q; D; g
{) X+ T0 O; J# `$ U1 y
if (conn != null) {+ f) I* c2 j) I0 D+ R
try {
; H- P/ i7 N# s' m conn.close();
. a2 y) l8 Y" o' R% J6 H6 | }
4 f" @2 e6 q; e# l$ q( ~# \/ p catch(SQLException sqlex2)
+ `' x5 i5 C4 E3 V' ?7 u( V {1 M k5 e9 z+ v7 P
System.err(this.getClass().1 k% l7 Q& m% }4 l; Q1 o
getName() + ".mymethod - 不能关闭数据库连接:
$ v+ P9 k: P" |" + sqlex2.toString());4 }4 r& F: I2 e
} t: h0 |( z" p, F) m E
}& R! H( ]8 b) q6 p" l# d
if (out != null)
' a3 ?9 q3 ^/ G* W! u5 |/ q{* ~3 y9 Z# D9 U9 w8 e& }7 w
try {
' U% @: z3 n3 H out.close();- b# V( @7 ^( B4 M, D
}# |5 P2 `6 E/ c- ]/ m& v
catch(IOException ioex2)' x' _( |! U7 {
{
, E+ R" ~, |8 X; G7 I3 ? System.err(this.getClass().9 I- H$ U _+ p, n9 K. @3 F
getName() + ".mymethod - + [' S) Q7 }3 J* j
不能关闭输出文件" + ioex2.toString());. A2 W* J9 e1 h
}
# J+ E. W! Q( g3 ?6 q }- ~% m4 `* \5 z) v* j
}</CCID_CODE></PRE></TD></TR></TABLE></CCID_NOBR></CENTER><BR><BR>本文的结论不是放之四海皆准的教条,有时常识和经验才是最好的老师。如果你对自己的做法没有百分之百的信心,务必加上详细、全面的注释。 <BR><BR>一方面,不要笑话这些错误,不妨问问你自己是否真地彻底摆脱了这些坏习惯。即使最有经验的程序员偶尔也会误入歧途,原因很简单,因为它们确确实实带来了“方便”。所有这些反例都可以看作Java编程世界的恶魔,它们美丽动人,无孔不入,时刻诱惑着你。也许有人会认为这些都属于鸡皮蒜毛的小事,不足挂齿,但请记住:勿以恶小而为之,勿以善小而不为。 <BR><BR>转载自: <a href="http://www.itzero.net/Article/learner/2005_10/3385.html" target="_blank" >http://www.itzero.net/Article/learner/2005_10/3385.html</A><BR> |
zan
|