数学建模社区-数学中国
标题:
[网摘]用六大代码问题检验你的Java知识能力(6)
[打印本页]
作者:
kampoo
时间:
2005-12-30 20:18
标题:
[网摘]用六大代码问题检验你的Java知识能力(6)
反例之六:输出数据不完整 <BR><BR>代码:7行-11行。 <BR><BR>不完整的数据是Java程序的隐形杀手。仔细观察这段代码,考虑一下如果循环的中间抛出了异常,会发生什么事情。循环的执行当然是要被打断的,其次,catch块会执行??就这些,再也没有其他动作了。 <BR><BR>已经输出的数据怎么办?使用这些数据的人或设备将收到一份不完整的(因而也是错误的)数据,却得不到任何有关这份数据是否完整的提示。对于有些系统来说,数据不完整可能比系统停止运行带来更大的损失。 <BR><BR>较为理想的处置办法是向输出设备写一些信息,声明数据的不完整性;另一种可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一次性输出。 <BR><BR>结论六:全面考虑可能出现的异常以及这些异常对执行流程的影响。 <BR><BR>改写后的代码 <BR><BR>根据上面的讨论,下面给出改写后的代码。也许有人会说它稍微有点?嗦,但是它有了比较完备的异常处理机制。 <BR><BR>
6 x# h' p' \* b+ k) H8 T
<CENTER><CCID_NOBR>
* U( q, S, O+ S. O9 h
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
4 E$ n4 L3 M9 C- e" K$ t
4 Q+ i* n; S) `/ H+ ]4 f n0 S
<TR>
1 H, G" ?6 |$ _2 j" Q, }
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><
RE><CCID_CODE>OutputStreamWriter out = ...
5 G- ^! ^! i) w+ t/ K1 B$ H
java.sql.Connection conn = ...
; y% H/ s3 y$ h; z4 \* C
try {
1 {1 D& Y. _/ K& |- r
Statement stat =
4 w* B/ {/ K4 ~) ~
conn.createStatement();
$ X; f" Q% D) q
ResultSet rs = stat.executeQuery
5 ?# c/ L( Y" H; g( I/ E* O
("select uid, name from user");
& x# D$ E4 [5 t% P) {& X5 h p: z
while (rs.next())
' E/ Z: T" d2 r! t( ]$ Y- g
{
# [' v2 z- C. X
out.println("ID:" +
9 f% `1 N4 w7 h
rs.getString("uid") + ",姓名: "
t+ P# Y/ J# x. g
+ rs.getString("name"));
' G/ p( P7 P9 U c, `' S0 d$ p* m
}
+ { t+ n" R& v( L4 _0 q0 s/ a0 S
}
5 h' `/ C" | Y; z: f* h. N8 v u2 U
catch(SQLException sqlex)
1 t1 f( p/ e; J2 L* Z
{
W9 q3 l; X% n7 [" e3 J" z2 K8 A1 t
out.println("警告:数据不完整");
/ _5 W$ Q" O) d/ q: Y# W1 I
throw new ApplicationException
% w( F: C# Q* q3 b O" m& e
("读取数据时出现SQL错误", sqlex);
% o9 F9 v4 _3 v3 ?) n" f
}
( K; R- w" P d1 O
catch(IOException ioex)
3 _, o1 M9 ~, L/ q; Q( p
{
7 s9 Z, P: z1 R$ c) c
throw new ApplicationException
% H3 y) ?# x5 l, n
("写入数据时出现IO错误", ioex);
, X ]' ^& R+ I
}
8 a# n( D6 V2 B& P, N' M, Y: J0 s
finally
% }- c- h( `4 h# o5 X
{
& M w* _6 u* Q. a! A. f
if (conn != null) {
3 T1 r5 f, e" X1 k6 K7 [
try {
% h4 y7 q4 N7 Z3 f# G
conn.close();
8 E1 @$ O- y5 X b5 P L
}
6 U9 j, X2 N; K4 }$ u. j
catch(SQLException sqlex2)
0 s5 B+ m9 l# O
{
$ J# R& B5 b( ~0 H0 r$ J* e! s
System.err(this.getClass().
) M4 q/ l8 E& r* l+ v* X. R
getName() + ".mymethod - 不能关闭数据库连接:
- C! \, }) B( n1 }
" + sqlex2.toString());
' ^8 C7 i" B# x, R* X/ K0 N
}
m8 _% A+ ^2 c
}
8 a- @! m- a9 K
if (out != null)
! W" U' { X% i
{
3 X, b1 E8 D+ P1 M
try {
+ J1 z, G) e4 z5 h6 o
out.close();
0 M ?2 V9 W$ S! G" z; ? i7 L3 K
}
( z ~& y ^- D2 K5 q
catch(IOException ioex2)
% S+ Q+ _" F; E7 X7 a
{
/ p7 V5 g% U$ D
System.err(this.getClass().
: u$ f6 W9 v; I7 e- o
getName() + ".mymethod -
4 ^5 l2 G: I6 f3 }+ _2 l& e
不能关闭输出文件" + ioex2.toString());
7 f6 r' w8 _3 ^; b5 k
}
7 W1 x* O& e& r( t5 q+ K6 G r
}
1 [' B, ]* ]% r9 h4 y5 B
}</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>
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5