`
李瑞辉++
  • 浏览: 19759 次
  • 性别: Icon_minigender_1
  • 来自: 信阳
社区版块
存档分类
最新评论

异常机制 小结

 
阅读更多

异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。

一.先介绍下面四

个类(来自java API 文档)。

  • Throwable

   Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。

   两个子类的实例,Error Exception,通常用于指示发生了异常情况。通常,这些实例是在异常情况的上下文中新近创建的,因此包含了相关的信息(比如堆栈跟踪数据)

  • Exception

  Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件,表示程序本身可以处理的异常。

  • Error

Error Throwable 的子类,表示仅靠程序本身无法恢复的严重错误,用于指示合理的应用程序不应该试图捕获的严重问题。

在执行该方法期间,无需在方法中通过throws声明可能抛出但没有捕获的 Error 的任何子类,因为Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即使没有用try...catch语句捕获它,也没有用throws字句声明抛出它,还是会编译通过。

  • RuntimeException

   RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即使没有用try...catch语句捕获它,也没有用throws字句声明抛出它,还是会编译通过,这种异常可以通过改进代码实现来避免。

 

二.Java语言中处理异常的五个关键词try, catch, throw, throwsfinally,try来执行一段程序,如果出现异常,系统会抛出一个异常,可以通过类型来捕捉(catch,或是在最后(finally)由默认处理器来处理.)

 

 

try{
 //程序块
}catch(Exception1  e){
 对Exception1  进行处理
} catch(Exception2  e){
 对Exception2  进行处理
}finally{
 最终处理块,不管异常是否被捕捉,这里都将执行.
}

 

 

三、Java异常处理机制

  对于可能出现异常的代码,有两种处理办法:

 

   1.在方法中用try...catch语句捕获并处理异常,catch语句可以有多个,用来匹配多个异常。例如: 

public void p(int x){ 
  try{ 
  ... 
  }catch(Exception e){ 
  ... 
  }finally{ 
  ... 
  } 
  }

 

 

   2、对于处理不了的异常或者要转型的异常,在方法的声明处通过throws语句抛出异常。例如:

 

 

public void test1() throws MyException{ 
  ... 
  if(....){ 
  throw new MyException(); 
  } 
  } 

 

 

 

  如果每个方法都是简单的抛出异常,那么在方法调用方法的多层嵌套调用中,Java虚拟机会从出现异常的方法代码块中往回找,直到找到处理该异常的代码块为止。然后将异常交给相应的catch语句处理。如果Java虚拟机追溯到方法调用最底部main()方法时,如果仍然没有找到处理异常的代码块,将按照下面的步骤处理:

    调用异常的对象的printStackTrace()方法,打印方法调用的异常信息。

    另外.finally语句在任何情况下都必须执行的代码,这样可以保证一些在任何情况下都必须执行代码的可靠性。finally语句先于return语句执行,而不论其先后位置,也不管是否try块出现异常。finally语句唯一不被执行的情况是方法执行了System.exit()方法。System.exit()的作用是终止当前正在运行的 Java 虚拟机。finally语句块中不能通过给变量赋新值来改变return的返回值,所以不要在finally块中使用return语句,没有意义还容易导致错误。

  最后还应该注意一下异常处理的语法规则:

  1try语句不能单独存在,可以和catchfinally组成 try...catch...finallytry...catchtry...finally三种结构,catch语句可以有一个或多个,finally语句最多一个,trycatchfinally这三个关键字均不能单独使用。

  2trycatchfinally三个代码块中变量的作用域分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。

  3、多个catch块时候,Java虚拟机会匹配其中一个异常类或其子类,就执行这个catch块,而不会再执行别的catch块。

  4throw语句后不允许有紧跟其他语句,因为这些没有机会执行。

  5、如果一个方法调用了另外一个声明抛出异常的方法,那么这个方法要么处理异常,要么声明抛出。

  那怎么判断一个方法可能会出现异常呢?一般来说,方法声明的时候用了throws语句,方法中有throw语句,方法调用的方法声明有throws关键字。

  throwthrows关键字的区别

  throw用来抛出一个异常,在方法体内。语法格式为:throw 异常对象。throws用来声明方法可能会抛出什么异常,在方法名后,语法格式为:throws 异常类型1,异常类型2...异常类型n

四、如何定义和使用异常类

  1、使用已有的异常类,假如为IOExceptionSQLException

 

    

try{ 
  程序代码 
  }catch(IOException ioe){ 
  程序代码 
  }catch(SQLException sqle){ 
  程序代码 
  }finally{ 
  程序代码 
  }

 

 

 

 2、自定义异常类

  创建Exception或者RuntimeException的子类即可得到一个自定义的异常类。例如 

 

 

 public class MyException extends Exception{ 
  public MyException(){} 
  public MyException(String smg){ 
  super(smg); 
  } 
  }

 

 3、使用自定义的异常

  用throws声明方法可能抛出自定义的异常,并用throw语句在适当的地方抛出自定义的异常。例如:

在某种条件抛出异常

 

public void test1() throws MyException{ 
  ... 
  if(....){ 
  throw new MyException(); 
  } 
  }

 

 

 

 

 

 

 

 将异常转型(也叫转译),使得异常更易读易于理解

 

 

 public void test2() throws MyException{ 
  ... 
  try{ 
  ... 
  }catch(SQLException e){ 
  ... 
  throw new MyException(); //异常转型
  } 
  }

 

 

   

 

 

五、运行时异常和受检查异常

  Exception类可以分为两种:运行时异常和受检查异常。

  1、运行时异常

  RuntimeException类及其子类都被称为运行时异常,这种异常的特点是Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即使没有用try...catch语句捕获它,也没有用throws字句声明抛出它,还是会编译通过。例如,当除数为零时,就会抛出java.lang.ArithmeticException异常。

  2、受检查异常

  除了RuntimeException类及其子类外,其他的Exception类及其子类都属于受检查异常,这种异常的特点是要么用try...catch捕获处理,要么用throws语句声明抛出,否则编译不会通过。

  3、两者的区别

  运行时异常表示无法让程序恢复运行的异常,导致这种异常的原因通常是由于执行了错误的操作。一旦出现错误,建议让程序终止。

受检查异常表示程序可以处理的异常。如果抛出异常的方法本身不处理或者不能处理它,那么方法的调用者就必须去处理该异常,否则调用会出错,连编译也无法通过。 当然,这两种异常都是可以通过程序来捕获并处理的,比如除数为零的运行时异常:

 

 

 

public class HelloWorld { 
  public static void main(String[] args) { 
  System.out.println("Hello World!!!"); 
  try{ 
  System.out.println(1/0); 
  }catch(ArithmeticException e){ 
  System.out.println("除数为0!"); 
  } 
  System.out.println("除数为零后程序没有终止啊,呵呵!!!"); 
  } 
  } 
  运行结果: 
  Hello World!!! 
  除数为0! 
  除数为零后程序没有终止啊,呵呵!!!

 

 

 

 

 

六、Java异常处理的原则和技巧

  1、避免过大的try块,不要把不会出现异常的代码放到try块里面,尽量保持一个try块对应一个或多个异常。

  2、细化异常的类型,不要不管什么类型的异常都写成Excetpion

  3catch块尽量保持一个块捕获一类异常,不要忽略捕获的异常,捕获到后要么处理,要么转译,要么重新抛出新类型的异常。

 

分享到:
评论

相关推荐

    java异常机制小结

    本资源主要描述java异常的知识,里面内容丰富,是java初学者的学习手册,java异常机制小结。

    java异常小结

    本文重在Java中异常机制的一些概念。写本文的目的在于方便大家很长时间后若是忘了这些东西可以通过这篇文章迅速回忆起来。

    零点起航Delphi7基础教程源码

    自己购买的教材 零点起航Delphi7基础教程源码 Delphi7是Inprise公司推出的面向对象的可视化编程语言,它提供...第13章 网络编程技术 13.1 网络基础知识 13.2 TCP/IP编程 13.3 使用网络函数编程 13.4 小结 参考文献

    高可用性的HDFS:Hadoop分布式文件系统深度实践

    第1章 HDFS HA及解决方案 1.1 HDFS系统架构 1.2 HA定义 1.3 HDFS HA原因分析及应对措施 1.3.1 可靠性 1.3.2 可维护性 1.4 现有HDFS HA解决方案 1.4.1 Hadoop的元数据备份方案 1.4.2 Hadoop的...8.5 小结

    php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACEeval()d code error

    syntax error, unexpected T_VAR错误解决方法PHP的异常处理类Exception的使用及说明php Try Catch异常测试PHP如何抛出异常处理错误php中异常处理方法小结PHP中的错误处理、异常处理机制分析实例讲解如何在PHP的Yii...

    程序开发原理:抽象、规格与面向对象设计.[美]Barbara Liskov(带详细书签).pdf

    4.2 Java异常机制 38 4.3 异常编程 42 4.4 设计问题 43 4.5 防御编程 46 4.6 小结 47 练习 47 第5章 数据抽象 48 5.1 数据抽象的规格 49 5.2 使用数据抽象 53 5.3 实现数据抽象 54 5.4 附加方法 59 5.5 ...

    C++编程思想习题

    1.7小结 第2章 数据抽象 2.1声明与定义 2.2一个袖珍C库 2.3放在一起:项目创建工具 2.4什么是非正常 2.5基本对象 2.6什么是对象 2.7抽象数据类型 2.8对象细节 2.9头文件形式 2.10嵌套结构 2.11小结 2.12练习 第3章 ...

    TCPIP详解--共三卷

    1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...

    C#与.NET3.5高级程序设计(第4版) 中文1

    1.14 小结 26 第2章 构建C#应用程序 27 2.1 NET Framework 3.5 SDK的作用 27 2.2 用csc.exe构建C#应用程序 28 2.3 使用TextPad构建.NET应用程序 32 2.4 使用Notepad++构建.NET应用程序 35 2.5 使用...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    1.11 小结 36 第2章 xml名称空间 38 2.1 声明名称空间 38 2.2 名称空间在元素和属性中的运用 39 2.2.1 名称空间在元素中的运用 39 2.2.2 默认名称空间 41 2.2.3 名称空间在属性中的运用 42 2.3 名称空间和dtd...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    1.11 小结 36 第2章 xml名称空间 38 2.1 声明名称空间 38 2.2 名称空间在元素和属性中的运用 39 2.2.1 名称空间在元素中的运用 39 2.2.2 默认名称空间 41 2.2.3 名称空间在属性中的运用 42 2.3 名称空间和dtd...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    1.11 小结 36 第2章 xml名称空间 38 2.1 声明名称空间 38 2.2 名称空间在元素和属性中的运用 39 2.2.1 名称空间在元素中的运用 39 2.2.2 默认名称空间 41 2.2.3 名称空间在属性中的运用 42 2.3 名称空间和dtd...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    1.11 小结 36 第2章 xml名称空间 38 2.1 声明名称空间 38 2.2 名称空间在元素和属性中的运用 39 2.2.1 名称空间在元素中的运用 39 2.2.2 默认名称空间 41 2.2.3 名称空间在属性中的运用 42 2.3 名称空间和dtd...

    网络编程教程,很好的一本写linux网络编程书,这是我上传的源码

    第一篇 基础知识篇  第一章 文件系统和进程系统  1.1 文件系统  1.1.1 文件系统的总体结构  1.1.2 文件结构和目录结构  1.2 文件系统的相关编程  1.3 进程系统  1.3.1 进程的概念... 本章小结

    突破程序员基本功的16课.part2

    1.3 小结 第2课 对象与内存控制 2.1 实例变量和类变量 2.1.1 实例变量和类变量的属性 2.1.2 实例变量的初始化时机 2.1.3 类变量的初始化时机 2.2 父类构造器 2.2.1 隐式调用和显式调用 2.2.2 访问子类对象...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    1.5小结 第2章程序设计基础:变量及其运算 2.1认识变量 2.1.1变量的定义 2.1.2变量有哪些类型 2.2如何使用变量 2.2.1如何使用整型变量 2.2.2如何使用浮点型变量 2.2.3如何使用字符型变量 2.2.4如何使用布尔...

    《深入理解Android》卷Ⅰ

    第1章 阅读前的准备工作 1.1 系统架构 1.1.1 Android系统架构 1.1.2 本书的架构 1.2 搭建开发环境 1.2.1 下载源码 1.2.2 编译源码 1.3 工具介绍 1.3.1 Source Insight介绍 1.3.3 Busybox的使用 ...10.5 本章小结

Global site tag (gtag.js) - Google Analytics