黑马程序员_异常

来源:互联网 发布:巧克力知乎 编辑:程序博客网 时间:2024/04/28 15:21

  

     一、异常概述

 异常:是在运行时期发生的不正常情况.在java中用类的形式对不正常情况进行了描述和封装对象.描述不正常的类就称为异常类.以前正常流程代码和问题处理代码相结合,现在将正常流程代码和问题处理分离,提高阅读性.其实异常就是java通过面向对象的思想将问题封装成了对象,用异常类对其进行描述.
异常的父类就是Throwale,是java语言中所有错误或异常的超类。只有当对象是此类或其子类的实例时,再能通过java虚拟机或者java thow语句抛出。
异常的体系:父类:Throwable   子类:Error和Exception
Error:通常出现的是重大问题:如运行的类不存在或者内存溢出,一般情况不可以处理.特点:由JVM抛出严重问题,已经影响到程序的执行,这种问题一般不针对处理,直接修改程序.
Exception:在运行时,出现的情况,它可以通过try{}catch(){}finally.Error和Exception子类名都以父类名作为后缀,阅读性比较强.

Throwable有一个特点:及所有的子类都具有可抛性,无路时Erroe还是异常问题,问题发生就应该抛出.

可抛性关键字

throws:自定义异常异常类的抛出.  throw:原理异常对象的抛出.

对于他们的区别我的理解是:1.throws使用在函数上,throw使用在函数内;2.throws抛出的是异常类,可以抛出多个,用"," 逗号隔开.throw抛出的是异常对象

自定义异常:自己写一个异常类,它必须继承异常体系,才具有可抛性.这里就简单的说一下.

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

public void test1() throws MyException{ ... if(....){  throw new MyException(); }} //将异常转型(也叫转译),使得异常更易读易于理解public void test2() throws MyException{ ... try{  ... }catch(SQLException e){  ...  throw new MyException(); }} //还有一个代码,很有意思:public void test2() throws MyException{ ... try {  ... } catch (MyException e) {  throw e; } }
这段代码实际上捕获了异常,然后又和盘托出,没有一点意义,如果这样还有什么好处理的,不处理就行了,直接在方法前用throws声明抛出不就得了。异常的捕获就要做一些有意义的处理

二、Exception的分类

Exception可以说是我们自己可以控制的,并且知道在这个时候可能会出现这样的异常,简单的说就是可以处理。

它分为两大类:1.编译时被检测异常:只要是Exception和其子类都是,除了特殊子类RuntimeException体系。这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应处理方式,可针对性处理。

     2.运行时的异常(编译通过,运行不通过):这就是RuntimeException和其子类.这种问题的发生,无法让功能继续,运算无法进行,更多是因为调用原因导致,或者引发了内部状态的改变导致的。这种问题编译允许通过,在运行时,让调用者调用时的程序强制停止,让调用者对代码进行修正。

总结:RuntimeException是可能在JVM正常运行期间抛出异常。Error是虚拟机出错,不可处理.

三、异常捕捉    

try{

可能会出现异常的代码;

     }

catch(会抛出的异常的所在类)

     {

出现异常后处理的的代码;                                       ← ← ← 左边就是通常对异常进行针对性处理方式

      }

finally

      {

不管是否出现异常都必须执行的代码;

       }

四、异常处理原则

1.函数内容如果抛出需要检测的异常,那么函数上必须声明,否则必须在函数内用try{}catch(){}捕捉.否则编译失败;

2.如果调用到了声明异常的函数,要么try{}catch(){},要么throws,否则编译失败;

3.什么时候catch,什么时候throws呢?我的理解是功能内容可以解决,就用catch.解决不了,用throws告诉调用者,由调用者解决.

4.一个功能如果抛出多个异常,那么调用时,必须有对应多个catch进行处理,内部有几个需要检测的异常,就抛出几个异常,抛几个就catch几个.

着这里列出几个try  catch  finally 组合的特点

1.try+catch+finally 需要处理异常,同时在有异常的情况下仍然要执行指定的代码

2.try+catch(多个) 当没有必要资源释放时,可以不定义

3.try+finally  异常无法直接catch处理,但资源需要关闭.

五、异常注意事项

1.子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只抛出父类的异常或该异常的子类.(这个说的可能有点绕,可以理解为遗传的特性,父亲的病遗传到儿子身上,那么儿子也要去医院看这个病)

2.如果父类抛出多个异常,那么子类只抛出父类异常的子集.

简单的说:子类覆盖父类,只能抛出父类的异常或者子类或子集.

注意:如果父类的方法没有抛出异常,那么子类覆盖时绝不能抛,只能try.


0 0
原创粉丝点击