黑马程序员---JAVA基础---异常(七)

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ---------------------- 

 

一、异常的概述
 1、异常的定义:程序在运行时出现的不正常情况。
2、异常的由来:问题也是现实生活中的一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象。(其实就是java对不正常情况进行描述后的对象的体现)。
3、对于问题的划分:分为两种,一种是严重的问题,一种是非严重的问题。对于严重的问题JAVA通过Error类进行描述,而Error一般不编写针对性的代码进行处理;对于非严重的,java通过Exception类进行描述(可以使用针对性的处理方式进行处理)
Throwable
  |--Error
  |--Exception
4、异常的分类
对于异常分成两类
(1)编译时被检测到的异常。
该异常在编译时,如果没有处理(没有抛也没有try),编译失败。该异常被标识,代表这可以被处理。
(2)编译时不被检测的异常(运行时异常)即RunrionException以及其子类。
  在编译时,不需要处理,编译器不检查。该异常的发生,建议不处理,让程序停止。需要对代码进行修正。

二、异常的处理方式
1、java提供了特有的语句进行处理
(1)第一种语句形式
try
{
需要被检测的代码;
}
catch(异常类 变量)
{
处理异常的代码;(处理方式)
}
finally
{
一定会执行的语句;
}
(2)第二种语句形式
try
{
需要被检测的代码;
}
catch(异常类 变量)
{
处理异常的代码;(处理方式)
}
(3)第三种语句形式
try
{
需要被检测的代码;
}
finally
{
一定会执行的语句;
}
2、异常的处理原则:
    (1)处理方式有两种:try 或者 throws。
    (2)调用到抛出异常的功能时,抛出几个,就处理几个。一个try对应多个catch。
    (3)多个catch,父类的catch放到最下面。
    (4)catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,输出语句。 也不要不写。当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。
3、对捕获到的异常对象进行常见方法操作。
    (1)e.getMessage():获取异常信息。
(2)e. toString():获取异常名称异常信息。
(3)e.printStackTrace();异常名称,异常信息,异常出现的位置。
其实JVM默认的异常处理机制就是在调用printStakTrace方法,打印异常在堆栈中的跟踪信息。
4、异常关键字throw和throws的区别?
(1)throws使用在函数上(写在小括号和大括号之间),throw使用在函数内。(从位置上讲)。
(2)hrows后面跟的是异常类,可以跟多个用,隔开。
(3)throw后面跟的是异常对象。
5、RuntimeException(在函数内被抛出时不需要在函数上声明)
Exception有一个特殊的子类异常RuntimeException运行时异常。
《注意》:如果在函数内被抛出该异常,函数上可以不用声明,编译一样通过。如果在函数上声明了该异常,调用者也可以不用处理,编译一样通过。之所以不用再函数上声明是因为不需要调用者处理。当该异常发生时,希望程序停止。
自定义异常时,如果该异常发生,无论在继续进行运算,就让自定义异常继承RuntimeException。

三、自定义异常
1、自定义异常的原因
因为项目中会出现特有的问题,而这些问题未被java所描述并封装成对象,所以对于这些特有的问题按照java的对问题封装的思想。将特有的问题进行自定义的异常封装。
《注意》:自定义异常必须是自定义类继承Exception。因为异常体系都有一个特点:因为异常类和异常对象都被抛出,他们都具备可抛性,这个可执行性是通过Throwable这个体系中独有的特点。只有这个体系中的类和对象才可以被throws和throw来操作。
2、异常处理
当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。要么在函数上声明要么让调用者处理,要么在内部try catch处理异常。

四、异常在继承中的体现
因为父类中已经把异常信息的操作都完成了。所以子类只要在构造时,将异常信息传递给父类通过super语句,那么就可以直接通过getMessage方法获取自定义的异常信息。
(1)子类在覆盖父类时,如果父类中的方法抛出异常,那么子类的覆盖方法只能抛出父类的异常或者该异常的子类或者不抛。
(2)如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出该父类异常的子集。
(3)如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。如果子类方法发生了异常,就必须要进行try处理,绝对不能抛。
例如,对数据库的操作:
class NoException extends Exception
{
public void method()throws NoException
{
连接数据库;
数据操作;//throw new SQLException();
关闭数据库;//该动作,无论数据操作是否成功,一定要关闭资源。
try
{
连接数据库;
数据操作;//throw new SQLException();
}
catch (SQLException e)
{
会对数据库进行异常处理;
throw new NoException();
}
finally
{
关闭数据库;
}
}
}

 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值