数学建模社区-数学中国

标题: [网摘]用六大代码问题检验你的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 hrs.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- ogetName() + ".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