数学建模社区-数学中国

标题: [网摘]用六大代码问题检验你的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>  J: Z' y5 p; O
<CENTER><CCID_NOBR>
& a0 ]6 K# T, t  A, k<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>% T# Z" D6 k4 z: k/ t4 n- t

9 {! K7 c  H3 J& [4 C<TR>
6 v) N% E, q# N<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><RE><CCID_CODE>OutputStreamWriter out = ...
- F1 M( Q( y# q" g" o  java.sql.Connection conn = ...& m( E" N8 C# ]( j! v) O
  try {! T4 Q5 H3 s+ D% s
   Statement stat =
. `4 ~2 u7 l/ B$ W" hconn.createStatement();; C2 {5 q( }$ X: v" \
   ResultSet rs = stat.executeQuery6 `" N2 ^# n9 t( W. D: C  l
("select uid, name from user");
2 y, }5 F$ I: G   while (rs.next())+ Z. H7 B) E) d- Q& L; G
   {: B' u* E* f* c
    out.println("ID:" + ) U) L, h/ _1 J4 r/ S* v
rs.getString("uid") + ",姓名: "& B2 X7 ^+ C# R+ s, C7 l
+ rs.getString("name"));5 \) o( N, M2 T8 A
   }. y; S) M! h6 k. w
  }
+ [$ i* ]7 _1 V. k  catch(SQLException sqlex), \- i0 D7 ?  V7 }+ w; K0 ~2 v
  {  Q, {) D8 `! X, |. o
   out.println("警告:数据不完整");
, x) o% k, W2 t( ?; d# u2 c   throw new ApplicationException
' q4 |: ]( O: x* s, J3 ^("读取数据时出现SQL错误", sqlex);
- Y$ V6 I1 d4 i- ^7 S  }; g5 H1 f6 O4 O, o
  catch(IOException ioex)7 v1 n8 U$ [( G
  {. z7 O+ k* A/ s0 L# O! O
   throw new ApplicationException
( T8 ~+ L1 L, r' O9 M("写入数据时出现IO错误", ioex);! t: `, O! R" ]: z
  }& Y+ Z+ _$ E( }  m
  finally
( Y" K6 o- k5 M2 D, v' G  M8 S  {# J  V2 T7 K, L5 c% `; ^
   if (conn != null) {
3 I7 v5 O' v" T    try {/ L( M. u) q" K! X8 n" Q/ G
     conn.close();
/ c* x, F8 U6 K( f7 E. Q* b- t    }+ v2 b3 J7 b# v
    catch(SQLException sqlex2)' d- @  ~6 {5 Y- \' Z' d
    {
" y5 v  g4 j$ g; W1 m     System.err(this.getClass().
2 F) m8 T! I, D+ [3 BgetName() + ".mymethod - 不能关闭数据库连接:+ c( e$ Z# a, y
" + sqlex2.toString());, r' u" j/ t3 R: M" t* b, t5 _! x
    }
! O; Z8 e) [& z$ n/ k! V   }. V% k+ l/ u1 h  S& e- k
   if (out != null)8 v! ~2 k& [$ T6 W
{- I1 f0 B3 p" p5 ~2 x
    try {% E* {# Y. B1 n% |% r
     out.close();% c% P2 |/ v. @
    }- s( M3 Z7 A4 N- _
    catch(IOException ioex2)
4 U3 k* ]0 N2 D8 ]0 \1 X( M  F    {" g* z, _* `6 a: [
     System.err(this.getClass().& y4 J5 }( r* k$ ~( V- y
getName() + ".mymethod - 2 F9 r  e0 o& g; y; G/ Q
不能关闭输出文件" + ioex2.toString());& _. v) k. \2 i, i7 h- s& d( ^; I4 Q
    }
+ k! d5 b" h8 |, t( \1 I+ u; x9 V2 U   }" \& G5 p( y8 o  a
  }</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