在编写程序的过程中,即使经验再丰富的程序员也不可避免的会出现错误,出现错误一般有三种情况:语法错误、逻辑错误、运行错误。语法错误是由于没有遵循Java的语言规则引起的,通过前面的学习,我们知道这种错误一般可以有编译器提醒解决,而逻辑错误也就是常见的BUG出现的状况,这只有在运行时一步步调试运行来解决。而运行错误,则是在程序运行时出现严重不可解决韦恩导致程序终止运行的错误,如:除数为0,数组下标越界、需要存取的文件不存在或网络突然中断等。通常这种情况称为异常。对于异常的处理则为一场处理
1.理解异常处理的概念
2.熟悉异常类型
3.掌握如何在方法中声明异常
4.掌握如何在方法中抛出异常
5.使用try…catch代码处理异常
6.创建自己的异常类
7.在try catch 代码块中使用finally子句
按照异常在编译时是否被检测来分可以分为两大类
1.受检异常(编译时被检测到的错误)
2.非受检异常(Runtime Exception和Error)
为避免出现异常导致中止执行,Java提供了相应得机制进行处理,当一个程序抛出异常后,将会回溯到第一个由catch的地方进行处理;
异常处理程序的基本形式
method()throws Exceptionl,Exception2,...
{
...
try
{
...程序块
}
catch(Exception1 e1)
{
//对Exceptionl e1处理
}
}
声明异常时当方法执行时,声明方法可能出现的异常。因为任何代码都有可能出现系统错误和运行异常,所以Java 不需要在任何方法中显式声明Error和RuntimeException。但是,如果方法出现其他异常,则必须在方法声明中显示声明它们。
异常声明 method()throws Exception
public class TestThrows
{
static void array(int size)throw NegativeArraySizeException,
ArratIndexOutOfBoundsException
{
int [] a=new int[size];
System.out.println(a[10]);
}
static void test()
{
array(-1);
}
public static void main(String[] args)
{
try{
test();
}catch (ArrayIndexOutBoundsException e)
{
System.out.println("数组越界");
}
}
}
在声明方法中如果出现异常,可以通过关键字throw 来抛出异常对象,抛出异常的语法如下
throw new ConstructorException();
ConstryctorException()是指异常类的构造方法。通过new ConstructException()来构造一个异常类的对象,再通过throw来抛出这个对象。要注意的是:一个方法只能抛出方法声明中的异常,或者Error、RuntimeException 和两者的子类
public class TestThrow
{
void method(){
//抛出ArithmeticException 异常,合法
throw new ArithmeticException();//ArithmeticException为RuntimeException子类
}
void method2(){
//抛出一个IOException 异常,不合法
throw new IOExcepetion();
}
}
通过上面介绍,我们知道了如何声明异常、如何抛出异常。下面我们将介绍如何捕获异常。在Java语言中,用try…catch语句来捕获异常。格式如下:
try{
//可能会出现异常情况的代码;
}catch(Exceptionl e){
}
catch(Exceptionl2 e)
{
//处理Exception2异常
}
如果在try子句执行期间没有出现异常,则跳过catch子句,如果try代码块中的语句抛出异常,Java则跳过剩下的语句,并开始搜索异常处理程序,一旦异常与catch子句中列出的其中一个异常匹配,则执行catch子句的代码;如果异常类型与catch子句中任何异常都不匹配,Java将退出该方法,并把异常传递到调用该方法的方法,并继续执行相同的过程来查找处理程序,如果在正被调用的方法链中没有找到处理程序,程序将会中止。
当方法中出现异常时,如果没有捕捉到异常,方法就立即退出,如果在退出钱需要方法执行某个任务,那么就可以捕捉方法中的异常,任何重新把它抛出给结构中实际处理程序
try{
可能出现异常情况的代码
}catch(Exception e){
//处理出现的Exception异常
throw e//重新抛出异常
}
在重新抛出异常中,要需要注意以下几点
(1)程序执行到throw 时立刻终止,不在执行它后面的语句
(2)在包含throw语句的try块后面寻找其匹配的catch子句来捕获异常
(3)如果找不到则向上一层程序JVM来处理。
finally子句中的语句不管是否异常是否被抛出都要执行,也就是就算throw一个异常catch接受处理以后也要执行finally中的语句。
Java提供许多异常类,但是Java所提供的异常类无法合适的描述我们所遇到的问题时,我们就可以自定义异常。
以下时需要注意的几个点
(1) 自定义异常需要继承Exception以及其子类
(2)若要抛出自定义的异常对象,则使用throw 关键字
(3)若要抛出自定义异常,需要将所调用的方法定义为可抛出异常的方法。