黑马程序员_异常

来源:互联网 发布:bigbangfxkk it 编辑:程序博客网 时间:2024/06/10 22:10

  <a href="http://www.itheima.com" target="blank">android培训</a><a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流     

  异常是对问题的描述,将问题对象进行封装。异常指不期而至的各种状况如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令执行顺序。Java通过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的错误条件。当条件生成时,错误将引发异常。  异常的好处在它既可以封装问题,又可以将正常流程和问题处理相分离,增强阅读性。

  异常处理的原则是,其一、处理方式是try或者throw,其二、调用到抛出异常的功能时,抛出几个就处理几个。其三、一个try对应多个catch。如果有多个catch,那么父类catch必须放到最下面,否则会有catch执行不到这种情况存在。其四、catch内需要定义针对性的处理方式,不要简单地定义成printStackTrace()、输出语句等,也别不写。其五、当捕获到的异常本功能处理不了时,可以继续在catch中抛出。如果异常处理不了,且该异常并不属于该功能出现的异常,此时可将异常转换后在抛出和该功能相关的异常,或者可以对异常进行处理。当需要将异常产生的和本功能相关的问题提供出去时,当调用者知道并处理,也可以将捕获到的异常处理后,转换成新的异常

  异常体系:Throwable及其子类Error和Exception。Error用于指示合理的应用程序不应该试图捕获的严重问题,例如运行类不存在或者内存溢出等等,不需要编写针对性的代码对其处理。Exception指出了合理的应用程序想要捕获的条件,可以通过try...catch...finally对其进行有针对的处理。Exception和Error的子类名以它们的父类名作为后缀,例如RutimeException。异常体系的特点是异常体系中所有类及其所创建的对象都具有可抛性,即可以被throw和throws所操作

  Throwable中的方法有getMessage(),即获取异常信息,返回字符串;toString(),即获取异常类名和异常信息,也返回字符串;printStackTrace(),除了获取异常类名和异常信息外,还获取异常出现在程序中的位置,返回值为void;printStackTrace(PrintStream s),通常用此方法将异常内容保存在日志文件中,以便程序员查阅。

  throws和throw。throws用于标识函数暴露出的异常,用在函数上,后跟异常类名,用于抛出异常类,可用多个逗号隔开;而throw用于抛出异常类对象,用在函数体内,后面跟异常对象,用于抛出异常类对象。

  当函数内容有throw抛出异常对象,并未用try处理,必须要在函数上声明。如果函数上声明了异常,那么调用者就需要处理,意思是说,调用者既可以抛出,又可以用try处理。

   通常,Java的异常(包括Exception和Error)分为可查的异常(checked exceptions)和不可查的异常(unchecked exceptions)。
   可查异常(编译器要求必须处置的异常):正确的程序在运行中,很容易出现的、情理可容的异常状况。可查异常虽然是异常状况,但在一定程度上它的发生是可以预估的,而且一旦发生这种异常状况,就必须采取某种方式进行处理。

    除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常时,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。

   不可查异常(编译器不要求强制处置的异常):包括运行时异常(RuntimeException与其子类)和错误(Error)。

   异常分为编译时异常和运行时异常RuntimeException。前者是会被检测的异常,在编译时如果没有处理,编译就不会通过。后者编译时不会被检测,所以在编译时不需要被处理,编译器不会检查。运行时异常发生时建议不处理,让程序终止,此时需要修正代码。

  异常处理有3种格式:try...catch,try...finally,try...catch...finally。其中,try定义需要被检测的代码块,它不能独立存在。catch定义异常处理方式。finally定义的代码一定会被执行到,所以它通常用于资源关闭,因为资源必须要被释放,例如关闭应用程序与数据库的连接,无论数据操作是否成功,一定要关闭连接。finally代码块只有一种情况不会被执行:在它之前执行了system.exit(0)。

  try、catch、finally语句块的执行顺序:

  1)当try没有捕获到异常时:try语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句;

  2)当try捕获到异常时,catch语句块里没有处理此异常的情况:当try语句块里的某条语句出现异常时,而没有处理此异常的catch语句块时,此异常将会抛给JVM处理,finally语句块里的语句还是会被执行,但finally语句块后的语句不会被执行;

3)当try捕获到异常,catch语句块里有处理此异常的情况:在try语句块中是按照顺序来执行的,当执行到某一条语句出现异常时,程序将跳到catch语句块,并与catch语句块逐一匹配,找到与之对应的处理程序,其他的catch语句块将不会被执行,而try语句块中,出现异常之后的语句也不会被执行,catch语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句;

  异常在子类覆盖中的体现:

  1、子类在覆盖父类方法时,如果父类方法抛出异常,则子类覆盖父类方法时应抛出父类异常或其子类。

  2、如果父类方法抛出了多个异常,那么子类在覆盖父类方法时只能抛出父类异常的子集。

  3、如果父类或接口方法中没有异常抛出,那么子类在覆盖父类方法时也不可以抛出异常。如果子类出现异常,那么必须要对其处理。

  自定义异常是指自定义的类继承Exception或其子类。通过构造函数定义异常信息。例如:

  class DemoException extends Exception
  {
DemoException(String message)
{
super(message);
}
   }

  通过throw将自定义异常抛出。当要自定义异常信息时,可以使用父类中已定义好的功能

  RuntimeException及其子类如果在函数中被throw抛出,可以不用在函数上声明。万一在函数上声明了,调用者可以不用处理。

  

 

0 0
原创粉丝点击