QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4047|回复: 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>
/ b8 l3 ?+ z) n. T<CENTER><CCID_NOBR>8 G% c( @, K" B2 B4 X% G$ `" g3 S- L
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>% C0 b' u, r% u/ y4 J
' g/ W: J- s$ B2 V3 V# [
<TR>* s5 R. |. R, ]3 A; p# h5 z
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><RE><CCID_CODE>OutputStreamWriter out = ...
0 @! w+ P# @2 P+ J* X; e, V  java.sql.Connection conn = ...' {* }% T2 a. N
  try {4 n9 G7 R4 W5 o  ~& `  U8 n% w! X' K, Y
   Statement stat = 6 H; T4 X3 X! U6 z1 S( s
conn.createStatement();
* e  J: I- C" }. {   ResultSet rs = stat.executeQuery! O6 f' Z0 U% Z' J. {
("select uid, name from user");2 d: ~$ v* N( e+ D) G$ z/ g
   while (rs.next())
5 T( I: _( U2 l5 Q. Z0 ?   {
! E5 D) T4 v2 Y' c* v5 F! j    out.println("ID:" +
, Y, }* z; ?: j$ N& k+ |rs.getString("uid") + ",姓名: "; ^, _6 ~4 ~* o/ S& Z# G
+ rs.getString("name"));
4 t5 |5 }7 I( r   }
6 ~3 g! I( V0 Q: n' E8 J7 S  }
0 ^2 A- J# {7 X. v8 B. R1 `  catch(SQLException sqlex)
8 ^6 m5 h8 ^1 d& c  {- y8 S1 c1 W! h& f& E! @
   out.println("警告:数据不完整");
7 V0 i7 ~9 i1 \. a6 R/ u   throw new ApplicationException
5 ~. Z6 C' p! H7 n3 [("读取数据时出现SQL错误", sqlex);
# h' S/ K' ^/ q" S2 c  }
* Z8 C/ W2 T- K: s5 N& J; N5 J  catch(IOException ioex): f$ b# M0 G8 C! w
  {0 ~* Z# z, n1 }. h5 I
   throw new ApplicationException
8 l5 ?) M! h3 [! R! Y6 J3 O3 R("写入数据时出现IO错误", ioex);- o$ r; z( P2 L% _$ ]  |, A
  }9 A- Y2 Y7 c# k
  finally
: S  h# P& |2 p6 }) N  {/ S6 k! E; V# u% \: U. ~- C1 Q
   if (conn != null) {* E' x; {# D6 @6 j, C' I5 q1 n
    try {7 N: m& K2 [( P( }2 J$ \; [# t, y; ]
     conn.close();3 h* D8 t  q6 Y
    }
, U5 ^8 w/ G  v3 q9 N0 E% Q2 F    catch(SQLException sqlex2)) Z4 V$ [, F. O8 S. C( i
    {
8 P( \2 a3 w8 c5 e' B     System.err(this.getClass().) L1 ~1 _# M) x; @4 m
getName() + ".mymethod - 不能关闭数据库连接:
% y" b! l! q$ N+ ?" + sqlex2.toString());7 R# P! b  e" M3 \0 U
    }* Z9 P1 p1 Y: d+ \, |- A
   }
8 w& X2 c# `" P, V   if (out != null)1 m9 g# @" x* c; `0 O2 {
{3 W! [5 n7 \( P" _! A5 j1 @
    try {
% A  O* s$ F3 U8 D4 a: s     out.close();- U) y4 l" p  G! m7 W
    }
8 P+ E/ w9 i/ E    catch(IOException ioex2)
  D# R: N5 c6 a    {+ {( {% k8 q* V$ B$ C
     System.err(this.getClass().. b* `7 m# `/ p! s! X( K
getName() + ".mymethod -
% g' S. b! G; U$ y不能关闭输出文件" + ioex2.toString());8 I" ~8 a9 F' Y4 h; m, R
    }# O# g! y5 `. O1 Y& Y: G
   }9 P/ z0 X& o8 x6 p: V
  }</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, 2026-6-10 23:36 , Processed in 0.435714 second(s), 52 queries .

回顶部