-
----------- android培训、java培训、java博客、java学习型技术博客、期待与您交流! --------------
本章主要的知识点总结:1、异常的简介和异常体系
2、异常的声明和处理方式。
3、如何自定义异常及异常的好处
一、异常的简介
异常:就是程序在运行时出现的不正常情况或错误。如程序要打开一个不存的文件、网络连接中断、操数组越界、装载一个不存在的类等。
异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述。并封装成对象,异常其实就是java对不正常情况进行描述后的对象体现。
异常体系:
Throwable
|--Error
|--Exception
|--RuntimeException
Throwable表示Java中可被抛出的对象,它是所有错误和异常的父类
Throwable有两个子类:Error、Exception
Error表示错误
Exception表示异常
RuntimeException表示运行时异常,是Exception的子类
异常体系的特点:异常体系中的所有类以及建立的对象都具备可抛性。 也就是说可以被throw和throws关键字所操作。 只有异常体系具备这个特点。
throw和throws的用法:
1、 throw定义在函数内,用于抛出异常对象。
2、 throws定义在函数上,用于抛出异常类,可以抛出多个,用逗号隔开。
异常以问题严重程度的划分为两种:一种是严重的问题Error(错误),一种非严重的问题,Exception(异常)
Error(错误)---由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其一般不编写针对性的代码对其进行处理。
Exception(异常) ---所有异常类的父类,子类定义了各种各样可能出现的异常事件,一般需要用户显式地声明向外抛出或捕获。
无论Error或者Exception都具有一些共性内容,比如:不正常情况的信息,引发原因等。
另外以异常发生时机划分为两种:
1、Runtime Exception(运行时异常)
一类特殊的异常,如被0除、数组角标越界等。产生比较频繁,处理麻烦,如果每次都处理,会对程序可读性和运行效率影响比较大,因此由系统检测并将它们交给缺省的异常处理程序,用户不必对其进行处理。这类异常不处理,编译时不会报错,只是在运行时出现错误时才报告异常,所以我们称之为运行时异常,所有RuntimeException的子类都是运行时异常。我们也可以对运行时异常进行处理。
2、编译时异常
Exception中除了RuntimeException的子类,其他异常都是必须要处理的,如果不处理,编译时会报错,这些异常我们称之为编译时异常。
二、异常的处理
在程序中可以在方法后面使用throws关键字声明向外抛出异常,对于编译时异常,通常我们需要使用try……catch语句进行捕获 。
java 提供了特有的语句进行处理。
try
{
需要被检测的代码;
}
catch(异常类 变量)
{
处理异常的代码;(处理方式)
}
finally
{
一定会执行的语句;//通常用于关闭资源。
}
finally可以结合try……catch使用,出现异常,finally里面的代码也会执行finally,只有一种情况不会执行,当执行到System.exit(0),finally不会执行。
throws和throw的区别:
throws使用在函数上。
throw使用在函数内。
throws后面跟的异常类。可以跟多个。用逗号隔开。
throw后跟的是异常对象。
对多异常的处理:
1、声明异常时,建议声明更为具体的异常。这样处理的可以更具体。
2、对方声明几个异常,就对应有几个catch块。不要定义多余的catch块。
如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。
在进行catch处理时,catch中一定要定义具体处理方式,不要简单定义一句 e.printStackTrack()也不要简单的就书写一条输出语句。
当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。
try
{
throw new AException();
}
catch (AException e)
{
throw e;
}
三、自定义异常
在程序开发中会出现程序特有的问题,而这些问题并未被java所描述并封装对象,所以对于这些特有的问题可以按照java的对问题封装的思想,将特有的问题。进行自定义的异常封装。
如何定义异常信息呢?因为父类中已经把异常信息的操作都完成了。所以子类只要在构造时,将异常信息传递给父类通过super语句。那么就可以直接通过getMessage方法获取自定义的异常信息。
例如: 异常异常信息传递给父类的构造函数。
class MyException extends Exception
{
MyException(String message)
{
super(message);
}
}
自定义类必须是继承Exception,继承Exception原因:异常体系有一个特点:因为异常类和异常对象都被抛出,他们都具备可抛性。这个可抛性是Throwable这个体系中独有特点。只有这个体系中的类和对象才可以被throws和throw操作。自定义异常时:如果该异常的发生,无法在继续进行运算,就让自定义异常继承RuntimeException。
Exceptoin中有一个特殊的子类异常RuntimeException 运行时异常,如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过,如果在函数上声明了该异常。调用者可以不用进行处理,编译一样通过;之所以不用在函数声明,是因为不需要让调用者处理。
当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。
异常的好处:
1、将问题进行封装。
2、将正常流程代码和问题处理代码相分离,方便于阅读。
异常的注意事项:
在子父类覆盖时:
1、子类抛出的异常必须是父类的异常的子类或者子集。
2、如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。