- 在线时间
- 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>
/ b8 l3 ?+ z) n. T<CENTER><CCID_NOBR>8 G% c( @, K" B2 B4 X% G$ `" g3 S- L
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>% C0 b' u, r% u/ y4 J
' g/ W: J- s$ B2 V3 V# [
<TR>* s5 R. |. R, ]3 A; p# h5 z
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>< RE><CCID_CODE>OutputStreamWriter out = ...
0 @! w+ P# @2 P+ J* X; e, V java.sql.Connection conn = ...' {* }% T2 a. N
try {4 n9 G7 R4 W5 o ~& ` U8 n% w! X' K, Y
Statement stat = 6 H; T4 X3 X! U6 z1 S( s
conn.createStatement();
* e J: I- C" }. { ResultSet rs = stat.executeQuery! O6 f' Z0 U% Z' J. {
("select uid, name from user");2 d: ~$ v* N( e+ D) G$ z/ g
while (rs.next())
5 T( I: _( U2 l5 Q. Z0 ? {
! E5 D) T4 v2 Y' c* v5 F! j out.println("ID:" +
, Y, }* z; ?: j$ N& k+ |rs.getString("uid") + ",姓名: "; ^, _6 ~4 ~* o/ S& Z# G
+ rs.getString("name"));
4 t5 |5 }7 I( r }
6 ~3 g! I( V0 Q: n' E8 J7 S }
0 ^2 A- J# {7 X. v8 B. R1 ` catch(SQLException sqlex)
8 ^6 m5 h8 ^1 d& c {- y8 S1 c1 W! h& f& E! @
out.println("警告:数据不完整");
7 V0 i7 ~9 i1 \. a6 R/ u throw new ApplicationException
5 ~. Z6 C' p! H7 n3 [("读取数据时出现SQL错误", sqlex);
# h' S/ K' ^/ q" S2 c }
* Z8 C/ W2 T- K: s5 N& J; N5 J catch(IOException ioex): f$ b# M0 G8 C! w
{0 ~* Z# z, n1 }. h5 I
throw new ApplicationException
8 l5 ?) M! h3 [! R! Y6 J3 O3 R("写入数据时出现IO错误", ioex);- o$ r; z( P2 L% _$ ] |, A
}9 A- Y2 Y7 c# k
finally
: S h# P& |2 p6 }) N {/ S6 k! E; V# u% \: U. ~- C1 Q
if (conn != null) {* E' x; {# D6 @6 j, C' I5 q1 n
try {7 N: m& K2 [( P( }2 J$ \; [# t, y; ]
conn.close();3 h* D8 t q6 Y
}
, U5 ^8 w/ G v3 q9 N0 E% Q2 F catch(SQLException sqlex2)) Z4 V$ [, F. O8 S. C( i
{
8 P( \2 a3 w8 c5 e' B System.err(this.getClass().) L1 ~1 _# M) x; @4 m
getName() + ".mymethod - 不能关闭数据库连接:
% y" b! l! q$ N+ ?" + sqlex2.toString());7 R# P! b e" M3 \0 U
}* Z9 P1 p1 Y: d+ \, |- A
}
8 w& X2 c# `" P, V if (out != null)1 m9 g# @" x* c; `0 O2 {
{3 W! [5 n7 \( P" _! A5 j1 @
try {
% A O* s$ F3 U8 D4 a: s out.close();- U) y4 l" p G! m7 W
}
8 P+ E/ w9 i/ E catch(IOException ioex2)
D# R: N5 c6 a {+ {( {% k8 q* V$ B$ C
System.err(this.getClass().. b* `7 m# `/ p! s! X( K
getName() + ".mymethod -
% g' S. b! G; U$ y不能关闭输出文件" + ioex2.toString());8 I" ~8 a9 F' Y4 h; m, R
}# O# g! y5 `. O1 Y& Y: G
}9 P/ z0 X& o8 x6 p: V
}</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
|