黑马程序员——异常

来源:互联网 发布:mac删除vmware fusion 编辑:程序博客网 时间:2024/05/16 08:23

 ——- android培训、java培训、期待与您交流! ———-
一,异常的概述
异常:就是程序在运行时出现的不正常情况,其实就是程序中出现的问题。因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信息最方便的方式就是将这些信息进行封装。异常就是java按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。
二,异常的体系
程序出现的问题有很多种,比如角标越界,空指针等都是。就对这些问题进行分类。而且这些问题都有共性内容比如:每一个问题都有名称,同时还有问题描述的信息,问题出现的位置,所以可以不断的向上抽取。形成了异常体系。
——–java.lang.Throwable:
Throwable:可抛出的。
|–Error:错误,出现严重的问题,一般情况下,不编写针对性的代码进行处理,通常是jvm发生的,需要对程序进行修正。
|–Exception:异常,不严重的问题,可以有针对性的处理方式,try catch finally

体系特点:
1,无论是错误还是异常,它们都有具体的子类体现每一个问题,它们的子类都有一个共性,就是都以父类名作为子类的后缀名。
2,这个体系中的所有类和对象都具备一个独有的特点;就是可抛性。
可抛性的体现:就是这个体系中的类和对象都可以被throws和throw两个关键字所操作。
三,异常的处理方式
1,捕捉
在定义功能时,发现该功能可能会出现一些问题,那么就要对其进行处理,一种方式就是捕捉,java有针对性的语句块进行处理。
try
{
需要被检测的代码;
}
catch(异常类 变量名)
{
异常处理代码;(处理的方式)
//catch是用于处理异常。如果没有catch就代表异常没有被处理过,如果该异常是检测时异常。那么必须声明。
}
Finally
{
一定会执行的代码;
}
功能内部通过关键字throw抛出异常对象,并没有进行处理,且函数上一定要声明,否则编译失败(运行时异常除外)。
代码示例:

class Demo{    int div(int a,int b)throws Exception//在功能上通过throws的关键字声明了该功能有可能会出现问题。    {        return a/b;    }}class  ExceptionDemo{    public static void main(String[] args)     {        Demo d = new Demo();        try        {            int x = d.div(4,1);            System.out.println("x="+x);        }        catch (Exception e)//Exception e = new ArithmeticException();e用于接收try检测到的异常对象。        {            System.out.println("除零啦");            System.out.println(e.getMessage());//  / by zero;            System.out.println(e.toString());// 异常名称 : 异常信息。            e.printStackTrace();//异常名称,异常信息,异常出现的位置。                            //其实jvm默认的异常处理机制,就是在调用printStackTrace方法。                            //打印异常的堆栈的跟踪信息。        }               System.out.println("over");    }}

2,抛出
功能内部不处理,应该将这些问题在定义功能时通过关键字throws标示异常,这样调用者就可以在使用这个功能的时候,预先给出处理方式。
格式:throws 异常类名,异常类名…
标示之后,调用者在使用该功能时,就必须要处理,否则编译失败(运行时异常例外)。

四,异常处理原则
1,处理方式有两种:try 或者 throws。
2,功能抛出几个异常,调用者如果进行try处理,就需要有与之对应的catch处理代码块,这样的处理有针对性,抛几个就处理几个。
如果多个catch块中的异常出现继承关系,父类异常的catch语句块,一定要放在下面。
3,catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,输出语句。也不要不写。
当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。
try
{
throw new AException();
}
catch (AException e)
{
throw e;
}
4, 异常的转换思想
如果该异常处理不了,但并不属于该功能出现的异常。可以将异常转换后,再抛出和该功能相关的异常。
或者异常可以处理,但需要将异常产生的和本功能相关的问题提供出去,让调用者知道,并处理。也可以将捕获异常处理后,转换新的异常。
try
{
throw new AException();
}
catch (AException e)
{
// 对AException处理。
throw new BException();
}
throw 和throws关键字的区别:
1,throw用于抛出异常对象,后面跟的是异常对象;throw用在函数内。
2,throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws用在函数上。

定义异常处理时,什么时候try,什么时候定义throws呢?
功能内部如果出现异常,如果内部可以处理,就用try;
如果功能内部处理不了,就必须声明出来,让调用者处理。

五,异常分两种
1:编译时被检查的异常,只要是Exception及其子类都是编译时被检测的异常。
2:运行时异常,其中Exception有一个特殊的子类RuntimeException,以及RuntimeException的子类是运行异常,也就说这个异常是编译时不被检查的异常。

编译时异常的特点:
1,如果在函数内抛出异常,函数必须要声明,否编译失败。
声明的原因:是需要调用者对该异常进行处理。
2,如果在函数上声明了该异常。调用者必须用进行处理。否则编译失败。
运行时异常的特点:
1,如果在函数内抛出异常,在函数上不需要声明。
不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用处理的,直接让程序停止,由调用者对代码进行修正。
2,如果在函数上声明了该异常。调用者可以不用进行处理。编译一样通过;

六,自定义异常
当程序中出现了java中没有定义过的问题时,这时就需要我们按照java异常建立思想,将项目的中的特有问题也进行对象的封装。这个异常,称为自定义异常。
自定义异常的步骤:
1,定义一个子类继承Exception或RuntimeException,让该类具备可抛性,和操作异常的共性方法。
2,通过throw 或者throws进行操作。
当要定义自定义异常的信息时,可以使用父类已经定义好的功能。
异常异常信息传递给父类的构造函数。
class MyException extends Exception
{
MyException(String message)
{
super(message);
}
}
例如:对于除法运算,0作为除数是不可以的。java中对这种问题用ArithmeticException类进行描述。对于这个功能,在我们项目中,除数除了不可以为0外,还不可以为负数。可是负数的部分java并没有针对描述。所以我们就需要自定义这个异常。

代码示例:

class FuShuException extends RuntimeException//自定义异常{    FuShuException(String msg)    {        super(msg);    }}class Demo{    int div(int a,int b)     {        if(b<0)            throw new FuShuException("出现了除数为负数了");        if(b==0)            throw new ArithmeticException("被零除啦");        return a/b;    }}class ExceptionDemo{    public static void main(String[] args)     {        Demo d = new Demo();        int x = d.div(4,-1);        System.out.println("x="+x);             System.out.println("over");    }}

七,finally,必须执行的代码
try catch finally的几种结合方式:
1. try
{
}
catch ()
{
}
2. try
{
}
finally
{
}
3. try
{
}
catch ()
{
}
finally
{
}
注意:
1,finally中定义的通常是 关闭资源代码。因为资源必须释放。
2,finally只有一种情况不会执行。当执行到System.exit(0)(退出jvm);fianlly不会执行。
八,异常在子父类中的体现
1,当子类覆盖父类的方法时,如果父类的方法抛出了异常,那么子类的方法要么不抛出异常要么抛出父类异常或者该异常的子类,不能抛出其他异常。
2,如果父类抛出了多个异常,那么子类在覆盖时只能抛出父类的异常的子集,可以不抛。
3,如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。
如果子类方法发生了异常。就必须要进行try处理。绝对不能抛。
如果这个异常子类无法处理,已经影响了子类方法的具体运算,这时可以在子类方法中,通过throw抛出RuntimeException异常或者其子类,这样,子类的方法上是不需要throws声明的。

 ——- android培训、java培训、期待与您交流! ———-

0 0
原创粉丝点击