免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1519 | 回复: 1
打印 上一主题 下一主题

Java编程中异常问题处理方式的区别和分析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-19 17:21 |只看该作者 |倒序浏览
Java编程中异常问题处理方式的区别和分析








Java代码
  1. 1.  一、内层方法抛出异常,外层方法捕捉并处理异常:   
  2. 2.  
  3. 3.  public void methodA (){   
  4. 4.  
  5. 5.  try{   
  6. 6.  
  7. 7.  // 调用methodB   
  8. 8.  
  9. 9.  methodB();   
  10. 10.  
  11. 11.  }   
  12. 12.  
  13. 13.  catch(ExceptionType et){   
  14. 14.  
  15. 15.  // 相应处理措施   
  16. 16.  
  17. 17.  }   
  18. 18.  
  19. 19.  }   
  20. 20.  
  21. 21.  public void methodB throws ExceptionType{   
  22. 22.  
  23. 23.  if (condition is true)   
  24. 24.  
  25. 25.  {   
  26. 26.  
  27. 27.  // 相应处理措施   
  28. 28.  
  29. 29.  }   
  30. 30.  
  31. 31.  else  
  32. 32.  
  33. 33.  {   
  34. 34.  
  35. 35.  throw new ExceptionType(argument);   
  36. 36.  
  37. 37.  }   
  38. 38.  
  39. 39.  }   
  40. 40.  
  41. 41.  在这个例子中,方法B的头部中声明了该方法会抛出一个类型为ExceptionType的异常,在方法体中使用throw子句抛出了一个异常,那么该异常被谁捕捉到呢,答案是方法A。因为异常抛出后,JVM会顺着该方法的调用栈一层一层的往上找。因为方法A中有一个catch(ExceptionType et),所以被抛出的异常会被捕捉到并处理。   
  42. 42.  
  43. 43.  二、方法中自己捕捉,处理异常:   
  44. 44.  
  45. 45.  public methodA() {   
  46. 46.  
  47. 47.  try  
  48. 48.  
  49. 49.  {   
  50. 50.  
  51. 51.  // 可能产生异常的语句   
  52. 52.  
  53. 53.  }   
  54. 54.  
  55. 55.  catch (ExceptionType et)   
  56. 56.  
  57. 57.  {   
  58. 58.  
  59. 59.  // 相应的处理   
  60. 60.  
  61. 61.  }   
  62. 62.  
  63. 63.  }   
  64. 64.  
  65. 65.  在这个例子中,方法A使用了try-catch语句块,那么意味着在方法中所产生的ExceptionType类型的异常都会被捕捉到并在方法内处理。   
  66. 66.  
  67. 67.  三、内层方法抛出一个异常,但本身又有try-catch  
  68. 68.  
  69. 69.  public methodB() throws ExceptionType{   
  70. 70.  
  71. 71.  try  
  72. 72.  
  73. 73.  {   
  74. 74.  
  75. 75.  // 可能产生异常的语句   
  76. 76.  
  77. 77.  }   
  78. 78.  
  79. 79.  catch (AnotherExceptionType aet)   
  80. 80.  
  81. 81.  {   
  82. 82.  
  83. 83.  // 相应处理措施   
  84. 84.  
  85. 85.  }   
  86. 86.  
  87. 87.  }   
  88. 88.  
  89. 89.  在这个例子中有两种异常处理情况,抛出异常和捕捉异常,如果在try语句块中产生ExceptionType类型的异常的话,会被抛出。如果产生AnotherExceptionType类型的话,则不会被抛出,因为在方法B的头部中并没有声明会抛出该异常。   
  90. 90.  
  91. 91.  四、内层方法抛出一个异常,但本身有try-finally  
  92. 92.  
  93. 93.  public methodB() throws ExceptionType{   
  94. 94.  
  95. 95.  try  
  96. 96.  
  97. 97.  {   
  98. 98.  
  99. 99.  // 可能产生异常的语句   
  100. 100.  
  101. 101.  }   
  102. 102.  
  103. 103.  finally  
  104. 104.  
  105. 105.  {   
  106. 106.  
  107. 107.  // 一定要执行的语句   
  108. 108.  
  109. 109.  }   
  110. 110.  
  111. 111.  }   
  112. 112.  
  113. 113.  这个例子与上一个例子很像,不同的是没有catch,但增加了finally。它的意思如果方法B中try语句块中如果产生了异常,则抛出由外层方法处理。然后方法B继续执行finally中的语句   
  114. 114.  
  115. 115.  下面列举三种错误的异常处理方法:   
  116. 116.  
  117. 117.  一、内层方法抛出一个异常,但本身有捕捉这个异常   
  118. 118.  
  119. 119.  public methodB() throws ExceptionType{   
  120. 120.  
  121. 121.  try  
  122. 122.  
  123. 123.  {   
  124. 124.  
  125. 125.  // 可能产生异常的语句   
  126. 126.  
  127. 127.  }   
  128. 128.  
  129. 129.  catch (ExceptionType et)   
  130. 130.  
  131. 131.  {   
  132. 132.  
  133. 133.  // 相应处理措施   
  134. 134.  
  135. 135.  }   
  136. 136.  
  137. 137.  }   
  138. 138.  
  139. 139.  在这个例子中,方法B在头部声明了会抛出一个类型为ExceptionType的异常,但在紧接下来的方法体又用了catch(ExceptionType et),如果产生了异常的话,会有什么结果呢?方法B抛出的异常马上被自身的catch捕捉到,所以方法头部的throws实际是没有作用的。外层方法是接收不到方法B抛出的异常对象的。   
  140. 140.  
  141. 141.  二、在try中使用了return,在fianlly中又使用了return  
  142. 142.  
  143. 143.  public methodB() {   
  144. 144.  
  145. 145.  try  
  146. 146.  
  147. 147.  {   
  148. 148.  
  149. 149.  // 可能产生异常的语句   
  150. 150.  
  151. 151.  return SOMEVALUE;   
  152. 152.  
  153. 153.  }   
  154. 154.  
  155. 155.  catch ()   
  156. 156.  
  157. 157.  {   
  158. 158.  
  159. 159.  }   
  160. 160.  
  161. 161.  finally  
  162. 162.  
  163. 163.  {   
  164. 164.  
  165. 165.  return SOMEVALUE_2;   
  166. 166.  
  167. 167.  }   
  168. 168.  
  169. 169.  }   
  170. 170.  
  171. 171.  在这个例证中,我们可以看到在try中返回了SOMEVALUE,那么程序执行到这里是否就结束了呢,其实不是的,因为finally中的语句是肯定会被执行到的,所以最后返回的是SOMEVALUE_2;那么意味者即使程序没有抛出异常,最后也得不到正确的结果。   
  172. 172.  
  173. 173.  三、把catch(Exception e)放在所有catch块的最前面   
  174. 174.  
  175. 175.  public methodB(){   
  176. 176.  
  177. 177.  try  
  178. 178.  
  179. 179.  {   
  180. 180.  
  181. 181.  }   
  182. 182.  
  183. 183.  catch (Exception e)   
  184. 184.  
  185. 185.  {   
  186. 186.  
  187. 187.  ...   
  188. 188.  
  189. 189.  }   
  190. 190.  
  191. 191.  catch (SubException se)   
  192. 192.  
  193. 193.  {   
  194. 194.  
  195. 195.  ...   
  196. 196.  
  197. 197.  }   
  198. 198.  
  199. 199.  }   
  200. 200.  
  201. 201.  在这个例子中,catch(Exception e)被放在所有catch语句块的最前面,因为Exception所有Exception类型的父类,所以意味着所有在try中产生的异常都会被捕捉到。后面其他的catch都是没有用的,所以一定要把catch(Exception e)放在最后面,如果前面所有的异常类型都不符合,至少保证还有一个可以处理它。   
  202. 202.  
  203. 203.  总结:   
  204. 204.  
  205. 205.  A.如果能够找到一个有意义的方法来捕获异常,就立即引入这个方法   
  206. 206.  
  207. 207.  B.否则就应该考虑做某些处理后传递或者再次抛出异常,也可以把异常转换为另一种形式,然后抛出一个新的异常   
  208. 208.  
  209. 209.  C.另一个方法是,可以完全忽略这个异常,而把它加到方法的头部的throws语句中,由调用这个方法的方法来处理它   
  210. 210.  
  211. 211.  D.通过捕获一个公共的异常超类,可以在一个块里面捕获多个异常,但不能够用一个空的catch语句 块来完全制止一个异常。  
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-03-19 17:21 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP