189 8069 5689

黑马程序员——异常篇

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

创新互联长期为上1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为云城企业提供专业的成都网站建设、网站制作云城网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。

异常:

   是什么?是对问题的描述。将问题进行对象的封装。

-----------------------------------------------------

   异常体现:

Throwable

|--Error

|--Exception

|--RuntimeException

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

-------------------------------------------------------

   throw和throws的用法:

       throw定义在函数内,用于抛出异对象。

       throws定义在函数上,用于抛出异常类,可以抛出多个,用逗号隔开。

       当函数内容有throw抛出异常对象,并未进行try处理。必须要在函数上声明,都在编译失败。

       注意,RuntimeException除外。也就是说函数内如果抛出RuntimeException异常,函数上可以不用声明。

------------------------------------------------------

   异常有两种:

编译时被检测异常:

该异常在编译时,如果没有处理(没有throw也没有try),编译失败。

运行时异常(编译时不检测):

在编译时,不需要处理,编译器不检查。该异常的发生,建议不处理,让程序停止。需要对代码进行修正。

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

--------------------------------------------------

   异常处理语句:

       try

       {

需要被检测的代码;

       }

       catch ()

       {

处理异常的代码;

       }

       finally

       {

一定会执行的代码;

       }

       有三个结合格式:

           1.try

{

}

catch ()

{

}

           2.try

{

}

catch ()

{

}

finally

{

}

           3.try

{

}

finally

{

}

   注意:

   1,finally中定义的通常是 关闭资源代码。因为资源必须释放。

   2,finally只要一种情况不会执行。当执行到System.exit(0);finally不会执行。

--------------------------------------------

   自定义异常:

定义类继承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,输出语句。也不要不写。

       5,当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。

try

{

throw newAException();

}

catch (AException e)

{

throw e;

}

如果该异常处理不了,但并不属于该功能出现的异常。可以将异常转换后,在抛出和该功能相关的异常。

       或者异常可以处理,当需要将异常产生的和本功能相关的问题提供出去。当调用者知道,并处理。也可以将捕获异常处理后,转换新的异常。

try

{

throw new AException();

}

catch (AException e)

{

//对AException处理。

throw new BException();

           }

           比如:汇款的例子。

-------------------------------------------  

   异常的注意事项:

       在子父类覆盖时:

1,子类抛出的异常必须是父类的异常的子类或者子集。

2,如果父类或者接口没有异常抛出时,子类覆盖出现异常只能try不能throw。

示例:ExceptionTest.java 老师用电脑上课。

/*
毕老师用电脑上课。
开始思考上课中出现的问题:电脑蓝屏,电脑冒烟。
当冒烟发生后,老师不能继续讲课。出现了讲师的问题,课时计划无法完成。
思路:
定义两个类,老师和电脑。
老师有姓名,上课方法(使用电脑上课),
电脑冒烟时,讲师有无法完成课时计划的问题。
电脑有运行方法、重启方法。
考虑电脑可能出现的问题:电脑蓝屏,电脑冒烟,定义两个异常类。
*/
class LanPingException extends Exception
{
    LanPingException(String message)
    {
        super(message);
    }
}
class MaoYanException extends Exception
{
    MaoYanException(String message)
    {
        super(message);
    }
}
class NoPlanException extends Exception
{
    NoPlanException(String message)
    {
        super(message);
    }
}
class Teacher
{
    private String name;
    private Computer cmpt;
    Teacher(String name)
    {
        this.name = name;
        cmpt = new Computer();
    }
    public void prelect()throws NoPlanException
    {
        try
        {
            cmpt.run();//调用抛出异常的run方法
        }
        catch (LanPingException e)
        {
            cmpt.reset();
        }
        catch (MaoYanException e)
        {
            test();
            throw new NoPlanException("课时无法继续"+e.getMessage());//处理不了,抛出异常,方法上抛出。
        }
        System.out.println("讲课");
                                                                                                                       
    }
    public void test()
    {
        System.out.println("练习");
    }
}
class Computer
{
    private int state = 3;//代表电脑的状态。
    public void run()throws LanPingException,MaoYanException
    {
        if (state == 2)
            throw new LanPingException("蓝屏了");
        if (state  == 3)
            throw new MaoYanException("冒烟了");
        System.out.println("电脑运行");
    }
    public void reset()
    {
        state = 1;//电脑恢复到正常状态。
        System.out.println("电脑重启");
                                                                                                                       
    }
}
class ExceptionTest
{
    public static void main(String[] args)
    {
        Teacher t = new Teacher("毕老师");
        try
        {
            t.prelect();
        }
        catch (NoPlanException e)
        {
            System.out.println(e.toString());
            System.out.println("换老师或者放假");
        }
                                                                                                                       
    }
}

示例:ExceptionTest1.java 图形面积。

/*
有一个圆形和长方形。
都可以获取面积。对于面积如果出现非法数值,视为是获取面积出现问题。
问题通过一次来表示。
先要对这个程序进行基础设计。
思路:
1,定义抽象图形类(或接口),获取面积方法。
2,圆形,长方形类继承图形类。
3,对问题进行描述。
*/
class NoValueException extends RuntimeException
{
    NoValueException(String message)
    {
        super(message);
    }
}
interface Shape
{
    void getArea();
}
class Rec implements Shape
{
    private int len,wid;
    Rec(int len,int wid)//throws NoValueException
    {
        if (len<=0 || wid <= 0)
            throw new NoValueException("非法值");
        this.len = len;
        this.wid = wid;
    }
    public void getArea()
    {
        System.out.println(len*wid);
    }
}
class Circle implements Shape
{
    public static final double PI = 3.14;
    private int radius;
    Circle(int radius)
    {
        if (radius <=0)
            throw new NoValueException("非法半径");
        this.radius = radius;
    }
    public void getArea()
    {
        System.out.println(radius*radius*PI);
    }
}
class ExceptionTest1
{
    public static void main(String[] args)
    {
        /*
        try
        {
            Rec r = new Rec(-3,4);
            r.getArea();
        }
        catch (NoValueException e)
        {
            System.out.println(e.toString());
        }
        */
        //Rec r = new Rec(-3,4);
        //r.getArea();
        Circle c = new Circle(-3);
        c.getArea();
    }
}

   定义包用package关键字。

   1:对类文件进行分类管理。

   2:给类文件提供多层名称空间。

   如果生成的包不在当前目录下,需要最好执行classpath,将包所在父目录定义到classpath变量中即可。

   一般在定义包名时,因为包的出现是为了区分重名的类。所以包名要尽量唯一。怎么保证唯一性呢?可以使用url域名来进行包名称的定义。

   package pack;//定义了一个包,名称为pack。 注意:包名的写法规范:所有字母都小写。

   //package cn.itcast.pack.demo;

   类的全名称是 包名.类名

   编译命令:javac –d 位置(.当前路径) java源文件 (就可以自动生成包)

   包是一种封装形式,用于封装类,想要被包以外的程序访问,该类必须public;类中的成员,如果被包以外访问,也必须public;

   包与包之间访问可以使用的权限有两种:

       1:public

       2:protected:只能是不同包中的子类可以使用的权限。

java中的四种权限:

      范围        public        protected       default      private

   同一个类中       ok             ok              ok          ok

   同一包中         ok             ok              ok      

   子类             ok          

   不同包中         ok

----------------------------------------------------

  Import- 导入:类名称变长,写起来很麻烦。为了简化,使用了一个关键字:import,可以使用这个关键字导入指定包中的类。记住:实际开发时,到的哪个类就导入哪个类,不建议使用*.

       import packa.*;//这个仅仅是导入了packa当前目录下的所有的类。不包含子包。

       import packa.abc.*;//导入了packa包中的子包abc下的当前的所有类。

       如果导入的两个包中存在着相同名称的类。这时如果用到该类,必须在代码中指定包名。

常见的软件包:

       java.lang : language java的核心包,Object System  String Throwable jdk1.2版本后,该包中的类自动被导入。

       java.awt : 定义的都是用于java图形界面开发的对象。

       javax.swing:提供所有的windows桌面应用程序包括的控件,比如:Frame , Dialog, Table, List 等等,就是java的图形界面库。

       java.net : 用于java网络编程方面的对象都在该包中。

       java.io : input  output 用于操作设备上数据的对象都在该包中。比如:读取硬盘数据,往硬盘写入数据。

       java.util : java的工具包,时间对象,集合框架。

       java.applet: application+let 客户端java小程序。server+let  --> servlet 服务端java小程序。

       

   jar :java的压缩包,主要用于存储类文件,或者配置文件等。

   命令格式:jar –cf 包名.jar 包目录

   解压缩:jar –xvf 包名.jar

   将jar包目录列表重定向到一个文件中:jar –tf 包名.jar >c:\1.txt


网站名称:黑马程序员——异常篇
URL网址:http://jkwzsj.com/article/jdjoei.html

其他资讯