Java和.net的异常处理

所谓的异常就是指在程序运行当中所发生的不正常事件,它会中止程序的运行,导致异常的的发生主要来自

Ø         代码错误,包括语法错误,逻辑错误,这些都是开发人员造成的

Ø         资源不可以,这是由系统访问了未经授权的资源而引起的错误

Ø         在.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中我们把所发生的异常分成两类

           用户程序执行所发生的异常,派生于ApplicationException 类

           公共运行库引发的异常,派生于SystemException 类

 

其实说起来异常处理机制很简单,对于可能会出现异常的部分,进行捕捉,处理就ok了,如果不想处理或者说不能在当前处理,我们可以通过throw抛出异常:throw new Exception或者是throw e;留给调用者进行处理

上面简单的介绍了以下关于异常的一些问题 但是需要注意的是 异常处理try...catch不宜多用,会影响程序运行的效率,建议没必要用的时候最好不要使用,我们可以通过判断,

尽量让这种异常不出现或者是通过其他方式给用户提示,像用户造出的异常,如compterLength(String str) 我们就没必要使用了,用一个else给用户提示一下就OK了,总之,看情况而定吧。

补充:在开发大型项目的时候,有时候需要使用框架和架构,比如三层中,数据访问层的异常,我们都会选择抛出,然后让调用这个方法的方法B去处理,如果它不处理,就由调用B这个方法的方法去处理,以此类推....

posted @ 2011-03-04 10:55  双魂人生  阅读(502)  评论(0编辑  收藏  举报