JavaSE学习笔记——异常

异常

概念:程序执行过程中的意外的结果.java中使用java.lang.Throwable表示异常的顶层的类.

java.lang.Throwable

概念:java语言中异常(Exception)和错误(Error)的父类.通常在程序开发很少直接处理Throwable.异常可以直观的反馈出程序当时出现的问题(异常的信息,以及异常的位置),程序员可以通过分析异常信息解决程序中的问题.方便对于程序的维护.

java.lang.Error

概念:是Throwable的子类,开发中不建议处理的错误.当Error出现,通常表示当前的程序执行的环境出现了问题.比如栈溢出,内存溢出.

java.lang.Exception

概念:是Throwable的子类,程序中需要进行捕获和处理的异常.常见的异常:NullPointerException表示空指针异常.IndexOutOfBoundsException下标越界的异常.

异常的分类

  1. 检测异常(check):除了RuntimeException以外如果该异常的直接父类是Exception,属于检测异常
    特点:检测异常:如果一个方法可能抛出检测异常,那么必须进行处理.(ParseException)
  2. 运行时异常(runtime):如果该异常的直接父类是RuntimeException,属于运行时异常.
    特点:在编译时可以不进行处理,在运行期间才会抛出的异常.

异常的处理方式

原则:java中异常的处理的基本原则:能处理就处理,不能处理抛给调用者.

  1. throws关键字
    特点:可以在声明方法时,使用throws声明该方法可能出现的异常,如果有多个异常,那么使用逗号隔开.如果出现了声明的异常,那么将该异常抛给调用者,单独使用throws无法实现在出现异常之后进行额外的处理(日志的记录,事务的处理)
   //使用throws声明该方法可能出现异常1或者异常n
   //如果方法出现声明的异常,会自动将该异常抛给调用者
   //如果方法中有检测异常的存在,就必须使用throws进行声明
   访问修饰符  返回值类型 方法名(参数类型列表) throws 异常1,..,异常n{

   }

异常的处理

  1. try-catch语句
    特点:可以将可能出现异常的代码定义在try块中,如果出现异常,在catch语句中进行捕获,同时提供额外功能的处理(记录日志)
   try{
      //可能发生异常的代码 
   }catch(Exception1 e){
      //如果try块中抛出了Exception1的实例,执行该catch语句
   }catch(Exceptoin2 e){
      //如果try块中抛出了Exception2的实例,执行该catch语句 
   }

注意
1. catch中声明的异常范围由小到大
2. 如果出现异常catch语句只会执行一个
3. jdk7.x提供了catch的优化的写法.如果是兄弟关系的异常可以使用|隔开.
4. 如果catch中不能处理该异常,必须使用throw关键字将该异常的实例抛给调用者.
- throw抛出检测异常的实例,必须在方法中使用throws声明该异常
- throw抛出运行时异常的实例,方法中使用throws声明不是必须的

经典面试题:throw和throws的区别?
- throws是在方法声明中使用,表示该方法可能出现的异常,多个异常使用逗号隔开,具备将异常的实例抛给调用者的功能.
- throw 在程序中抛出一个异常的实例.

finally

特点:配合try块,表示总是执行的概念.finally中定义的代码不管是否出现异常总是会执行.

   try{
       //开启了物理资源 //物理资源必须手动释放
       //操作资源
   }catch(Exceptoin e){
       //捕获异常,对异常进行处理或者提供额外功能
        throw e;
   }finally{//finally中的代码总是执行
        //释放资源
   }

注意
1. try块不能独立存在,后面必须定义catch或者finally,二者可以只有一个,或者同时存在,catch块可以定义多个,finally最多只能有一个
2. finally总是执行,除非JVM终止,不推荐在finally中使用return关键字
3. finally中通常用于释放物理资源(IO流/Connection对象)

自定义异常

概念:根据业务需求定义的业务相关的异常.(用户名密码错误/字符串格式正确),自定义异常是对Java异常体系一种补充.

自定义异常的开发步骤

  1. 提供一个类继承Exception/RuntimeException
    • 如果继承Exception:该自定义异常属于检测异常
    • 如果继承RuntimeException:该异常属于运行时异常.
  2. 为该类提供相应的构造器

你可能感兴趣的:(Java)