QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3766|回复: 0
打印 上一主题 下一主题

[网摘]用六大代码问题检验你的Java知识能力(6)

[复制链接]
字体大小: 正常 放大
kampoo        

85

主题

2

听众

400

积分

升级  33.33%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-12-30 20:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
反例之六:输出数据不完整 <BR><BR>代码:7行-11行。 <BR><BR>不完整的数据是Java程序的隐形杀手。仔细观察这段代码,考虑一下如果循环的中间抛出了异常,会发生什么事情。循环的执行当然是要被打断的,其次,catch块会执行??就这些,再也没有其他动作了。 <BR><BR>已经输出的数据怎么办?使用这些数据的人或设备将收到一份不完整的(因而也是错误的)数据,却得不到任何有关这份数据是否完整的提示。对于有些系统来说,数据不完整可能比系统停止运行带来更大的损失。 <BR><BR>较为理想的处置办法是向输出设备写一些信息,声明数据的不完整性;另一种可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一次性输出。 <BR><BR>结论六:全面考虑可能出现的异常以及这些异常对执行流程的影响。 <BR><BR>改写后的代码 <BR><BR>根据上面的讨论,下面给出改写后的代码。也许有人会说它稍微有点?嗦,但是它有了比较完备的异常处理机制。 <BR><BR>
" K/ V7 m4 r7 `& N5 k* }  F0 [<CENTER><CCID_NOBR>* @4 B$ K. u* H2 O; ?/ x
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
5 t) ]  V0 h6 P) @5 N# b; h" C: H
6 a: q4 g( O2 P* E  N2 r8 y<TR>5 p4 E9 _/ ]2 \0 {0 C/ Y) k
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><RE><CCID_CODE>OutputStreamWriter out = ...5 Y. v6 H8 F* r& M6 p/ B
  java.sql.Connection conn = .... y4 R( Z' x* h% N+ E
  try {* S" J8 p3 p, w7 N
   Statement stat = " ^2 t/ G7 N( \4 r
conn.createStatement();
* t1 ^8 _% k+ Y   ResultSet rs = stat.executeQuery2 i' I2 |3 V' W  N/ J1 l$ d
("select uid, name from user");! F. v8 ]$ |$ V  Z: f7 j0 l( _
   while (rs.next())
" V) d& N4 f' d' y0 q! b" I( h   {
. N; o1 I* Z1 @- }' T8 V9 d8 b: `: V    out.println("ID:" +
2 T- I9 I. d4 v: srs.getString("uid") + ",姓名: "; x  f, L; S. B3 c" K
+ rs.getString("name"));
( W, R; k: K. M- i   }* E; y" c6 E: r! ]
  }
) m* h9 M: k0 a' a$ M! F! t  catch(SQLException sqlex)* q' s6 Q0 ^3 O+ l
  {
- V: {/ g) N. a' L- N- h! x   out.println("警告:数据不完整");4 L9 L5 o! h* x  b! \! x8 o
   throw new ApplicationException
. ?! l1 c4 j( l, K- u4 \4 ?("读取数据时出现SQL错误", sqlex);
% ?. Y0 q( L! |+ M  }
3 e( ^+ f  ~, q2 Q1 l$ z# M  catch(IOException ioex)9 C6 j6 b. P" L" t* M4 i$ f
  {
( s) w( ^& M" r1 L) S8 j   throw new ApplicationException
4 y0 [0 j! s, O% \" F% X) H("写入数据时出现IO错误", ioex);
$ \, n2 ?. a3 K  }
  O' Z7 F% Z% n$ T# Y8 X  finally3 _) h/ ]8 q; D; g
  {) X+ T0 O; J# `$ U1 y
   if (conn != null) {+ f) I* c2 j) I0 D+ R
    try {
; H- P/ i7 N# s' m     conn.close();
. a2 y) l8 Y" o' R% J6 H6 |    }
4 f" @2 e6 q; e# l$ q( ~# \/ p    catch(SQLException sqlex2)
+ `' x5 i5 C4 E3 V' ?7 u( V    {1 M  k5 e9 z+ v7 P
     System.err(this.getClass().1 k% l7 Q& m% }4 l; Q1 o
getName() + ".mymethod - 不能关闭数据库连接:
$ v+ P9 k: P" |" + sqlex2.toString());4 }4 r& F: I2 e
    }  t: h0 |( z" p, F) m  E
   }& R! H( ]8 b) q6 p" l# d
   if (out != null)
' a3 ?9 q3 ^/ G* W! u5 |/ q{* ~3 y9 Z# D9 U9 w8 e& }7 w
    try {
' U% @: z3 n3 H     out.close();- b# V( @7 ^( B4 M, D
    }# |5 P2 `6 E/ c- ]/ m& v
    catch(IOException ioex2)' x' _( |! U7 {
    {
, E+ R" ~, |8 X; G7 I3 ?     System.err(this.getClass().9 I- H$ U  _+ p, n9 K. @3 F
getName() + ".mymethod - + [' S) Q7 }3 J* j
不能关闭输出文件" + ioex2.toString());. A2 W* J9 e1 h
    }
# J+ E. W! Q( g3 ?6 q   }- ~% m4 `* \5 z) v* 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>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2025-8-6 07:23 , Processed in 0.288988 second(s), 51 queries .

回顶部