`
zzc1684
  • 浏览: 1192912 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Java编程中异常问题处理方式的区别和分析

    博客分类:
  • Java
阅读更多
  一、内层方法抛出异常,外层方法捕捉并处理异常:

  public void methodA (){

  try{

  // 调用methodB

  methodB();

  }

  catch(ExceptionType et){

  // 相应处理措施

  }

  }

  public void methodB throws ExceptionType{

  if (condition is true)

  {

  // 相应处理措施

  }

  else

  {

  throw new ExceptionType(argument);

  }

  }

  在这个例子中,方法B的头部中声明了该方法会抛出一个类型为ExceptionType的异常,在方法体中使用throw子句抛出了一个异常,那么该异常被谁捕捉到呢,答案是方法A。因为异常抛出后,JVM会顺着该方法的调用栈一层一层的往上找。因为方法A中有一个catch(ExceptionType et),所以被抛出的异常会被捕捉到并处理。

  二、方法中自己捕捉,处理异常:

  public methodA() {

  try

  {

  // 可能产生异常的语句

  }

  catch (ExceptionType et)

  {

  // 相应的处理

  }

  }

  在这个例子中,方法A使用了try-catch语句块,那么意味着在方法中所产生的ExceptionType类型的异常都会被捕捉到并在方法内处理。

  三、内层方法抛出一个异常,但本身又有try-catch

  public methodB() throws ExceptionType{

  try

  {

  // 可能产生异常的语句

  }

  catch (AnotherExceptionType aet)

  {

  // 相应处理措施

  }

  }

  在这个例子中有两种异常处理情况,抛出异常和捕捉异常,如果在try语句块中产生ExceptionType类型的异常的话,会被抛出。如果产生AnotherExceptionType类型的话,则不会被抛出,因为在方法B的头部中并没有声明会抛出该异常。

  四、内层方法抛出一个异常,但本身有try-finally

  public methodB() throws ExceptionType{

  try

  {

  // 可能产生异常的语句

  }

  finally

  {

  // 一定要执行的语句

  }

  }

  这个例子与上一个例子很像,不同的是没有catch,但增加了finally。它的意思如果方法B中try语句块中如果产生了异常,则抛出由外层方法处理。然后方法B继续执行finally中的语句

  下面列举三种错误的异常处理方法:

  一、内层方法抛出一个异常,但本身有捕捉这个异常

  public methodB() throws ExceptionType{

  try

  {

  // 可能产生异常的语句

  }

  catch (ExceptionType et)

  {

  // 相应处理措施

  }

  }

  在这个例子中,方法B在头部声明了会抛出一个类型为ExceptionType的异常,但在紧接下来的方法体又用了catch(ExceptionType et),如果产生了异常的话,会有什么结果呢?方法B抛出的异常马上被自身的catch捕捉到,所以方法头部的throws实际是没有作用的。外层方法是接收不到方法B抛出的异常对象的。

  二、在try中使用了return,在fianlly中又使用了return

  public methodB() {

  try

  {

  // 可能产生异常的语句

  return SOMEVALUE;

  }

  catch ()

  {

  }

  finally

  {

  return SOMEVALUE_2;

  }

  }

  在这个例证中,我们可以看到在try中返回了SOMEVALUE,那么程序执行到这里是否就结束了呢,其实不是的,因为finally中的语句是肯定会被执行到的,所以最后返回的是SOMEVALUE_2;那么意味者即使程序没有抛出异常,最后也得不到正确的结果。

  三、把catch(Exception e)放在所有catch块的最前面

  public methodB(){

  try

  {

  }

  catch (Exception e)

  {

  ...

  }

  catch (SubException se)

  {

  ...

  }

  }

  在这个例子中,catch(Exception e)被放在所有catch语句块的最前面,因为Exception所有Exception类型的父类,所以意味着所有在try中产生的异常都会被捕捉到。后面其他的catch都是没有用的,所以一定要把catch(Exception e)放在最后面,如果前面所有的异常类型都不符合,至少保证还有一个可以处理它。

  总结:

  A.如果能够找到一个有意义的方法来捕获异常,就立即引入这个方法

  B.否则就应该考虑做某些处理后传递或者再次抛出异常,也可以把异常转换为另一种形式,然后抛出一个新的异常

  C.另一个方法是,可以完全忽略这个异常,而把它加到方法的头部的throws语句中,由调用这个方法的方法来处理它

  D.通过捕获一个公共的异常超类,可以在一个块里面捕获多个异常,但不能够用一个空的catch语句 块来完全制止一个异常。

 

分享到:
评论

相关推荐

    基于JAVA语言的异常处理探讨分析.pdf

    本文主要对 JAVA编程过程中的问题进行分解,首先应尽量避免出现错误和异常,针对无法避免和预测的情况要考虑在发生异常的时 候怎样处理。从JAVA语言的概念和特点等方面,对JAVA语言的异常进行了分析,阐述了JAVA语言...

    Java编程艺术 PDF

    Herbert Schildt 和James Holmes两位编程大师通过将Java应用于某些有趣、实用的计算机问题和编程任务中,全面展示了Java语言的强大功能、敏捷性、多样性和艺术性。本书各章内容分别涉及到Java精髓、递归下降的表达式...

    深入理解Java编程中异常处理的优劣

    本篇文章是对Java编程中异常处理的优劣进行了详细的分析介绍,需要的朋友参考下

    Java编程中的检查型异常与非检查型异常分析

    主要介绍了Java编程中的未检查型异常与非检查型异常,以及异常的处理方式,需要的朋友可以参考下

    Java 7并发编程实战手册

    《Java 7并发编程实战手册》适合具有一定Java编程基础的读者阅读和学习。如果你是一名Java开发人员,并且想进一步掌握并发编程和多线程技术,并挖掘Java 7并发的新特性,那么本书是你的合适之选。 《Java 7并发编程...

    深入Java Servlet网络编程

    1 Java中的异常处理机制 2. 4. 2 在Java Servlet中处理异常 2. 4. 3 向浏览器发送标准的HTTP错误 2. 4. 4 服务器端日志记录 2. 5 Servlet在n-层结构中的作用 第3章 会话育理 3. 1 使用传统方法进行会话管理...

    java编程基础,应用与实例

    第11章 异常处理(exception handing) 154 11.1 try-catch语句 154 11.2 Exception类的种类 157 11.3 可抛出异常的方法 158 11.4 自定义异常 161 11.5 巩固练习 162 第12章 常用API之一 164 12.1 ...

    Java规范,代码结构清晰.统一异常处理和日志管理,方便定位问题和排错

    通过观看这些视频教程,您可以更加深入地掌握Java编程和项目开发的技能。 总之,本资源包内容丰富、实用性强,是您完成Java毕业设计的必备宝典。无论您是即将毕业的本科生还是研究生,都值得拥有这份宝贵的参考资料...

    Java编程汉字乱码原因分析及解决方法研究.pdf

    java程序输入输出汉字时常常出现乱码现象,针对这一异常,本文首先介绍了java和JSP文件编译时对汉字字符处理的基本原理,接着分析了java程序与其他媒介交互时产生乱码现象的根本原因,最后针对产生异常的每种情况给出了...

    java源码包---java 源码 大量 实例

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA基础课程讲义

    异常的处理办法之三,手动抛出异常,throw子句 103 自定义异常 103 使用异常机制建议 104 总结 105 思考作业 105 上机作业 105 第五章 数组 106 数组概述和特点 106 创建数组和初始化 106 数组常见操作 108 数组的...

    java开源包8

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    C++编程思想源码

    本书第2卷介绍了c++实用的编程技术和最佳的实践方法,深入探究了异常处理方法和异常安全设计;介绍c++的字符串、输入输出流的现代用法;解释多重继承问题的难点,描述了典型的设计模式及其实现,特别介绍了多线程...

    基于java的电子相册源码.zip

    通过阅读和分析Java源码,可以帮助学习者深入理解Java编程语言的特性和最佳实践,提高编程技能,解决实际问题。同时,Java源码也是开发人员进行软件开发的基础,可以用于构建各种类型的应用程序和系统。 这个Java...

    基于java的日记本源码.zip

    通过阅读和分析Java源码,可以帮助学习者深入理解Java编程语言的特性和最佳实践,提高编程技能,解决实际问题。同时,Java源码也是开发人员进行软件开发的基础,可以用于构建各种类型的应用程序和系统。 这个Java...

    java面向对象程序设计习题集

    第九章 异常处理 151 一、选择题 151 二、填空题 155 三、判断题 157 四、程序阅读题 158 五、程序题 163 第十章 文件操作 165 一、选择题 165 二、填空题 170 三、判断题 174 四、读程序题 177 五、问答题 182 六、...

    Java并发编程(学习笔记).xmind

    Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...

    基于java的考勤管理系统源码.zip

    通过阅读和分析Java源码,可以帮助学习者深入理解Java编程语言的特性和最佳实践,提高编程技能,解决实际问题。同时,Java源码也是开发人员进行软件开发的基础,可以用于构建各种类型的应用程序和系统。 这个Java...

    基于java的SSM商城系统源码.zip

    通过阅读和分析Java源码,可以帮助学习者深入理解Java编程语言的特性和最佳实践,提高编程技能,解决实际问题。同时,Java源码也是开发人员进行软件开发的基础,可以用于构建各种类型的应用程序和系统。 这个Java...

Global site tag (gtag.js) - Google Analytics