学习-异常处理

时间:2022-05-09 19:48:01

  java把各种异常封装成各种类,当某异常产生的时候会生成相应的异常对象,默认的处理异常对象的方式,是当前语句停止,并且将异常对象抛给当前语句的调用者,如果异常对象出现在main方法,则抛给虚拟机.虚拟机的处理方式是关掉整个程序.

  一.Throwable类

  Throwable类-可抛的,继承自Object,是所有异常与错误的父类.他有两个方法经常被使用.

  1.getMessage方法,返回异常的字符串消息;

  2.printStackTrace方法,追踪打印抛出异常的地方.

  他有两个子类:

  1.Error类-错误

  往往是代码无法修复的,一般是硬件问题或者是运行环境问题.

  2.Exception类

  是可以用代码修复的.

  二.异常处理

  上面说了Error是代码处理不了的,所以不在处理范围内,异常处理指的就是对Exception类及其子类的对象的处理,异常分为两类:

  1.运行时异常(RuntimeException)

  顾名思义,运行时异常就是没有语法错误,编译时不会出现异常,而是程序运行起来以后发生的异常.

  处理方式:a.最好的处理方式是预先针对可能发生异常的语句做出判断和处理.

       b.在a无法实现的时候就要使用异常捕获机制:try(尝试) - cahch(捕获) - finally(最终),三个关键字组成的语句块

      try{

        //⑴

      } catch (⑵) {

        //⑶

      } finally {

        //⑷

      }

  在⑴中书写的是有可能发生异常的代码.如果是多个语句.在其中一个语句发生异常时,try语句结束,后面的代码将不会被执行,直接跳到catch块捕获到相应异常的语句块执行其内容;

  在⑵中书写的是要捕获的异常类型以及变量名(用于指向对应的异常对象);

  在⑶中书写的是处理该异常的语句;在异常类型没有继承关系的时候,多个catch语句块之间是平行关系不分先后;在异常类型有继承关系的时候,多个catch语句块之间必须有顺序,子类写在前,父类写在后;

  在⑷中书写的是不管有没有发生异常都会执行的语句,一般用作资源清理和关闭管道;如果没有非要执行的语句,finally语句块是可以不写的;值得注意的是finally 语句块的执行时机.如果,try语句或者catch语句有break,continue,return等命令,在计算机读到这些命令准备执行时,会检查是否有finally语句块,如果有,执行暂停,先执行finally语句块.所以当return一个值的时候,如果finally语句要修改这个值是没办法影响返回结果的.比如:a = 10;在前面语句中要return a;在finally语句中要执行a++;最后返回出去的还是10.因为计算机已经把返回值准备好了,只是暂停返回.

  关键字:throw - 抛出

  使用他可以主动将一个异常对象纳入到默认的异常传播机制中.

  2.编译时异常

  这种异常是Exception子类中除了运行时异常意外的其他子类.

  特点是,凡是使用关键字throws的方法都是有可能出现异常的,throws作用是警告使用者,要预先处理该异常;throws写在方法声明的最后面,后跟有可能出现的异常类型;这种预先就知道可能会发生的异常叫做编译时异常.

  处理的方式:a.使用异常捕获机制;

          b.也在声明部分写throws跟异常类型,将其抛给当前语句的调用者;

  throw throws
书写位置 写在方法的实现部分 写在方法的声明部分(形参列表之后)
后面跟的代码 后面接一个异常对象 后面接一个到多个异常类型
意义 一旦运行到throw语句就好真正产生一个异常对象抛出 警告调用者可能发生某类型的异常

 

  3.自定义异常

  做法:a.新建自定义异常,让其继承Exception;

     b.通过调用父类指定构造,让自定义异常通过传入的任何一个异常对象构造自身;通过调用父类指定构造,让自定义异常通过传入的字符串异常信息构造自身;

     c.添加我们自己需要的异常方法(如:书写日志);