javaAPI(异常)

来源:互联网 发布:java lamda表达式语法 编辑:程序博客网 时间:2024/05/16 14:00
  • 异常:就是程序在运行时出现不正常的情况.
  • 异常的由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式描述,并封装成对象.
  • 其实就是java对不正常情况进行描述后的对象体现.

    • 对于问题的划分:两种:一种严重的问题.一种非常严重的问题.
  • 对于严重的,java通过Error类进行描述.
  • 对于Error一般不编写针对性的代码对其进行处理.
  • 对于非严重的,java通过Exception可以使用针对性的处理方式进行处理.

    • 无论Error或者Exception都具有一些共性内容.
  • 如:不正常情况的信息,引发原因等.

    • Throwable
  • |–Error
  • |–Exception

    • 2,异常的处理:
  • java提供好了特有的语句进行处理.

    • try
  • {
  • 需要被检测的代码;
  • }
  • catch
  • {
  • 处理异常的代码:(处理方式)
  • }
  • finally
  • {
  • 一定会执行的语句;
  • }

    • 3,对捕获到的异常对象进行常见的方法操作.
  • String getMessage(); 获取异常的信息.
  • 在函数上声明异常.
  • 便于提高安全性,让调用者去处理.不处理则编译失败.

    • 对多异常的处理:
  • 1,声明异常时,建议声明更为具体的异常,这样处理更具体.
  • 2,对方声明了几个异常,就因该有几个catch块.不要定义多余的catch块.
  • 如果多个catch块的异常出现继承关系,父类异常catch块放在最下面.

    • 建议在进行catch处理中,catch中一定要定义具体的处理方式.
  • 不要简单定义一句 e.printStackTrace();
  • 也不要简单的就书写一条输出语句.
  • *
 class Demo{    int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException    //throws Exception:在功能上通过throws的关键字声明了该功能有可能会出现问题.    {        int[] arr = new int[a];        System.out.println(arr[4]);        return a/b;    }}public class ExceptionDemo {    public static void main(String[] args)//throws Exception    //throws Exception:抛出异常    {        Demo d = new Demo();        try//捕捉异常        {        int x = d.div(3,0);        System.out.println("x="+x);        }        catch(ArithmeticException e)//Exception e = new Exception();        {        System.out.println("除以零了,不能运算");        System.out.println("e.getMessate()");//异常信息 by zero        System.out.println("e.toString()");//异常名称,异常信息        e.printStackTrace();//异常名称,异常信息,异常出现的位置.            //其实jvm默认的异常处理机制,就是在调用printStacktrace()方法.            //打印异常的堆栈的跟踪信息.        }        catch(ArrayIndexOutOfBoundsException e)        {            System.out.println(e.toString());            System.out.println("脚标越界了");        }        System.out.println("over");    }}
  • 因为项目中会出现特有的问题,
  • 而这些问题并未被java所描述并封装对象.
  • 所以对于这些特有的问题可以按照java的对问题封装的思想.
  • 将特有的问题,进行自定义的异常封装.

    • 自定义异常:
  • 需求:在本程序中,对于除数是-1,也视为是错误的是无法进行运算的.
  • 那么我们就要自己定义异常.

    • 当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作.
  • 要么在内部try catch 处理.
  • 要么在函数上声明让调用者处理.

    • 一般情况在,函数内出现异常,函数上需要声明.

    • 自定义异常信息:
  • 因为父类中已经把异常信息的操作都完成了.
  • 所以子类只要在构造时,将异常信息传递给父类通过super语句.
  • 那么就可以直接通过getMessage()方法获取自定义的异常信息.

    • 注意:自定义异常必须是自定义类继承Exception.

    • 继承Exception原因:
  • 异常体系有一个特点:因为异常和异常对象都被抛出.
  • 它们都具备可抛性,这个可抛性是Throwable这个体系中的独有特点.
  • 只有这个体系中的类和对象才可以被throws和throw操作

    • throws和throw的区别:
  • throws使用在函数上.
  • throw使用在函数内.
  • throws后面跟的是异常类,可以跟多个.用逗号隔开.
  • throw后跟的是异常常对象.

    • Exception中有一个特殊的子类异常RuntimeException:运行时异常.
  • 如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过.
  • 如果在函数内容上声明了该异常.调用者可以不用进行处理.编译一样通过.

    • 之所以不用在函数声明,是因为不需要让调用者处理.
  • 当该异常发生,希望程序停止.一维在运行时,出现了无法继续运算的情况,希望停止程序后,
  • 对代码进行修正.

    • 自定义异常时,如果该异常的发生,无法在继续进行运算.
  • 就让自定义异常继承RuntimeException.

    • 对于异常分两种:
  • 1,编译时被检测的异常
  • 2,编译时不被检测的异常(运行时异常,RuntimeException以及子类)

    • finally代码块:
  • 定义一定执行的代码.通常用于关闭资源.
  • public void method()
  • {
  • try
  • {
  • 连接数据库;
  • 操作数据库;//throw new SQLException();

    • }
  • catch(SQLException e)
  • {
  • 会对数据库进行异常处理;
  • throw new NoException();
  • }
  • finally
  • {
  • 关闭数据库;
  • }
  • }

    • catch是用于处理异常.如果没有catch就代表异常没有被处理过.
  • 如果该异常是检测时异常,那么就必须声明.

    • 异常在子父类覆盖的体现:
  • 1,子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类.
  • 2,如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集.
  • 3,如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常.
  • 如果子类方法发生了异常,就必须要进行try处理.绝对不能抛.
class FuShuException extends Exception//getMessage();{    private int value;    FuShuException()    {        super();    }    FuShuException(String msg,int value)    {        super(msg);        this.value = value;    }    public int getValue()    {        return value;    }}class Demo1{    int div1(int a,int b)throws FuShuException    {        if(b<0)            throw new FuShuException("出现了除数是负数的情况--/by fushu",b);            //手动通过throw关键字抛出一个自定义异常.        return a/b;    }}public class ExceptionDemo2{    public static void main(String[] args)    {        Demo1 d = new Demo1();        try        {            int x = d.div1(3,-9);            System.out.println("x="+x);        }        catch(FuShuException e)        {            System.out.println(e.toString());            //System.out.println("除数是负数了");            System.out.println(e.getValue());        }    }}

异常总结:
异常:是对问题的描述,将问题进行对象的封装.

异常体系:

 Throwable    |--Error    |--Exception        |--RuntimeException

异常体系中的特点:
异常体系中所有类以及建立的对象都具有可抛性.
也就是说可以被throw和throws关键字所操作.
只有异常体系具备这个特点.

throw和throws的用法:
throw定义在函数上,用于抛出异常对象.
throws定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开.

当函数内容有throw抛出异常对象,并未进行try处理,必须要在函数上声明,否则编译失败.
注意:RuntimeException除外,也就是说,函数内如果抛出的是RuntimeException异常,函数上可以不用声明.

如果函数上声明了异常,调用者需要进行处理.处理方法可以throws可以try.

异常有两种:
编译时被检测异常,该异常在编译时,如果没有处理(没有抛也没有try),编译失败.
该异常被标识,代表着可以被处理.
运行时异常(编译时不检测),在编译时,不需要处理,编译器不检查.
该异常的发生,建议不处理,让程序停止,需要对代码进行修正.

finally中定义的通常是关闭资源代码,因为资源必须释放.
finally只有一种情况不会执行,当执行到System.txie(0);

自定义异常:
定义继承Exception或者RuntimeException
1,为了让该自定义具备可抛性.
2,让该类具备操作异常的共性方法.

当要自定义异常的信息时,可以使用父类已经定义好的功能.异常信息传递给父类的构造函数.

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

自定义异常:按照java的面向对象的思想,将程序中出现的特有问题进行封装.

异常的好处:
1,将问题进行封装.
2,将正常流程代码和问题处理代码相分离,方便于阅读.

异常处理原则:
1,处理方式有两种:try或者throws.
2,调用到抛出异常的功能时,抛出几个就要处理几个.一个try对象多个catch.
3,多个catch,父类的catch要放到最下面.
4,catch内,需要定义针对性的处理方式,不要简单的定义printStackTrace,输出语句,也不要不写.

{ throw new AException(); } catch(AException e) { throw e; }

如果并不属于该功能出现的异常,可以将异常转换后,在抛出和该功能相关的异常.
或者调用者知道,并处理,也可以将捕获异常处理后,转换新的异常.

 try {    throw new AException(); } catch(AException e) {    //对AException处理    throw new BException(); }
0 0
原创粉丝点击