数学建模社区-数学中国

标题: [网摘]用六大代码问题检验你的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>5 H' j- o. X+ i) _7 v2 s
<CENTER><CCID_NOBR>: L  j$ u1 d( `2 b
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>7 G( M5 a) @* K8 o0 L, U9 e( }

$ w& e- B0 h! H" ~9 Y6 o6 M# O<TR>- h0 O7 f7 o) g/ x
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><RE><CCID_CODE>OutputStreamWriter out = ...+ X; |4 i6 |  v2 A
  java.sql.Connection conn = ...( V8 ~, B- l& d/ _0 v! y
  try {
" Q4 y! o& q2 X3 o, N   Statement stat = & _9 [, g; c$ s2 v: F
conn.createStatement();( r0 i: S1 B/ v& X5 _; {
   ResultSet rs = stat.executeQuery* A# v3 T( C2 `6 e, T# v, u$ Q
("select uid, name from user");
0 x/ F3 ?5 k' ~4 v* U   while (rs.next())" \4 S" l2 @8 ]: F- W" Z- ^# A
   {
+ F% G: N2 c! ^- E2 s0 j    out.println("ID:" +
: @- {; L- t8 }$ k( y$ p/ qrs.getString("uid") + ",姓名: "1 G, m: i; H3 w+ s
+ rs.getString("name"));( i4 a: v/ M" L
   }
; b8 v2 ]# W" u' ]9 S- X  }0 ?- u9 z1 ^! ~, ~  f4 T2 l- i
  catch(SQLException sqlex)4 M5 a2 k# n( C  n
  {- n) W, v1 I* W4 X+ }7 n& Q
   out.println("警告:数据不完整");
7 ~+ a& w( ?6 Z8 {/ f   throw new ApplicationException
4 N. |# s6 i# Y- t* @("读取数据时出现SQL错误", sqlex);% J# A! O' J; m  z; L+ y
  }
; S% w; w7 X  C  catch(IOException ioex)9 {! b; _6 U. i3 O0 d# B; o8 x8 x
  {
1 q5 z- Y! q) T1 a, G, _& D   throw new ApplicationException' ]6 N) Q3 k3 |/ F  R: s. Y
("写入数据时出现IO错误", ioex);
8 n0 p0 x/ u. H  }* q2 r+ h, s2 U4 m0 V4 J- o
  finally
% @! A1 Y1 l+ A7 t, \  {8 m- N& ?! t3 F! g# s, E& X
   if (conn != null) {. u7 D6 N1 z. U  [; m
    try {9 ]& Q! {! m, M1 R
     conn.close();+ @8 p" F) s6 y/ R6 a% a
    }' {, g+ U+ ]" Z0 h. K
    catch(SQLException sqlex2). \1 @) o$ u% W1 N# n3 P
    {" o: {3 v% p2 s
     System.err(this.getClass().* Z3 D6 ?+ Z  N
getName() + ".mymethod - 不能关闭数据库连接:
/ ^4 q: T+ I% u3 Y$ Z" + sqlex2.toString());  ?( z% t% ]) Z; ?; q7 H8 m' I
    }/ Z1 ]: \' U5 T
   }
$ u6 R( q* z# _3 {5 V: B$ r; i7 \% x& j   if (out != null)
  _; e9 _  P: e  R' h{7 p: A. C# X; v% W8 u& b+ \
    try {
3 R; O: ?( t6 o4 g  g! V( e     out.close();
' `/ }- K  N$ j! |- }  K    }
: \( `9 T6 L( g  F1 p: a! [- E' S7 V    catch(IOException ioex2)! U- ~1 f$ O: D. H" W
    {
) x! R. [6 ^; a) `, r( Z     System.err(this.getClass().
2 ^( g/ ]; g5 V2 d* k/ dgetName() + ".mymethod - $ Z2 [; `/ B# L" ~; `& l8 v$ P
不能关闭输出文件" + ioex2.toString());( }* _2 R2 Z! r' G
    }
$ P' r4 g* B$ O8 Y2 S' W4 O0 d( ~4 ^   }
9 W, H2 w* l1 u2 Y/ {0 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>




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5