所谓的异常就是指在程序运行当中所发生的不正常事件,它会中止程序的运行,导致异常的的发生主要来自
Ø 代码错误,包括语法错误,逻辑错误,这些都是开发人员造成的
Ø 资源不可以,这是由系统访问了未经授权的资源而引起的错误
Ø 在.net中,公共语言运行库也就是在clr内部也会引发异常
异常和错误有很大的区别,就好像你开车从A地到B地,如果中间的路坏了,没法走了,这就是异常,中止了我们开车行走,所有需要处理一下就好了,如果是车坏了,那么你根本就没办法开车去,就好像程序里你编译都通不过那样
异常处理是很必要的,原因有一下几点:
1 为了防止程序的崩溃,中止运行
2 使程序更加严谨,也是防止数据库结构泄露
3 一种友好的提示
4 使程序员中能够很快的找到错误的根源,以便解决问题
那么怎样才能处理这样的异常呢,换句换话说我们如何进行异常处理呢 现在我们分别来看看在java和.net中是如何处理的:
Java:在java中我们主要通过5个关键字来实现的
ü Try: 包含着可能发生异常的代码
ü Catch: 用来捕获和处理异常
ü Finally: 无论是否发生异常,finally中的代码都要执行,但是假如ry中发生的异常和catch 当中不匹配,finally中的代码将不被执行,因为try直接中止的了程序的行!
ü Throws: 总是出现在方法的声明中,用来表明该方法可能抛出的异常 (异常的类名)
ü Throw: 总的出现在方法体中,用来抛出一个异常,是为了让调用该方法人能够及
的捕捉异常,通常和throws或try…..catch一起使用,抛出的是用new关键字申明的异常的对象
Java中的异常主要在java.lang包中的 所以lang包不用导入直接写上可能发生异常的异常名就可以了!!异常的根是Exception,其他的异常都是继承它而来的,是它的子类:
以下是一些常见的异常:
² ArithmeticException:算术错误,比如除数为0
² ArrayIndexOutBoundException:数组大于或小于实际数组的大小
² NullPointExceoption:所谓的空指针异常,试图访问null对象的成员
² ClassNotFoundException:不能加载所需的类
² InputMismatchException:欲得到的数据类型与输入的数据类型不匹配
² IllegalArglumentException:方法接收到的参数错误
先看一个例子
package com.exception.hnaccp;
public class Text {
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
compter();
compterLength("shen");
}catch(ArithmeticException ex)
{
System.out.print(ex.getMessage());
}
catch(IllegalArgumentException ee)
{
System.out.print(ee.getMessage());
}
}
static void compter()
{
try
{
if(6/0==5)
{
System.out.print("----");
}
}catch(ArithmeticException ex)
{
throw new ArithmeticException("除数不能为0");
}
}
static void compterLength(String str)throws IllegalArgumentException
{
if(str.length()==6)
{
System.out.print("OK");
}else
{
throw new IllegalArgumentException("字符串输入不正确");
}
}
}
看到上面的这段代码不知道你得到了什么?
首先看看方法一compter() 像这样的问题我们要直接用try....catch去处理,因为很明显,执行到if语句块时立马会出现异常,而这种异常是系统有的,会导致程序的终止,所以我们要及时的用catch去处理,是抛出还是其他的处理方式,要看情况而定了
其次在来看看方法二compterLength(String str) 输入的参数错误,就会导致if中的语句块不被执行,但是,系统不会马上抛出什么异常,因为语法,逻辑都没什么错误,只不过参数输入错误,导致方法不起作用罢了,为了防止这样的问题,并让调用者知道错误的根源,我们要造出一个异常,并让它抛出或用try ...catch去处理即可,由于if语句块不执行,那么我们就在else中抛出处理异常就可以了
最后还要注意的就是在调用方法是时候catch中的异常要不是方法中抛出的很明确的那个很有可能发生的异常,要不就是他们的父类Exception,方法中抛出的异常也要和catch()中的相匹配,或者在方法名后声明抛出的异常,否则将会退出方法引发其他的异常或编译错误,多重catch的时候Exception一定要放在最后,否则后面的将不会被执行
另外,自己也可以自定义异常,继承父类Exception即可,可以重写父类的各个方法
public class MyException extends Exception
{
public String getMessage(){
return "自定义异常错误";
}
}
MyException就是自定义的异常,重写了Exception的getMessage方法,当然了,也可以重写Exception当中其他的方法!
.Net
.net中的异常处理和java很相似,他们之间也存在着一些差别,在.net中对于异常的处理没有throws,不需要在方法后声明异常,而java有的时候则需要,其他的大部分都一样
在.net中我们把所发生的异常分成两类
1 用户程序执行所发生的异常,派生于ApplicationException 类
2 公共运行库引发的异常,派生于SystemException 类
其实说起来异常处理机制很简单,对于可能会出现异常的部分,进行捕捉,处理就ok了,如果不想处理或者说不能在当前处理,我们可以通过throw抛出异常:throw new Exception或者是throw e;留给调用者进行处理
上面简单的介绍了以下关于异常的一些问题 但是需要注意的是 异常处理try...catch不宜多用,会影响程序运行的效率,建议没必要用的时候最好不要使用,我们可以通过判断,
尽量让这种异常不出现或者是通过其他方式给用户提示,像用户造出的异常,如compterLength(String str) 我们就没必要使用了,用一个else给用户提示一下就OK了,总之,看情况而定吧。
补充:在开发大型项目的时候,有时候需要使用框架和架构,比如三层中,数据访问层的异常,我们都会选择抛出,然后让调用这个方法的方法B去处理,如果它不处理,就由调用B这个方法的方法去处理,以此类推....