当前位置导航:炫浪网>>网络学院>>编程开发>>JAVA教程>>Java入门

Java编程那些事儿83——异常处理语法2

    Java编程那些事儿系列文章(全集目录)

    10.3.3 捕获异常及异常处理

    在整个异常处理机制中,异常在系统中进行传递,传递到程序员认为合适的位置,就捕获到该异常,然后进行逻辑处理,使得项目不会因为出现异常而崩溃。

    为了捕获异常并对异常进行处理,使用的捕获异常以及处理的语法格式为:

                   try{

                            // 逻辑代码

                   }catch( 异常类名 参数名 ){

                            // 处理代码

                   }

    在该语法中,将正常的程序逻辑代码书写在try语句块内部进行执行,这些代码为可能抛出异常的代码,而catch语句中书写对应的异常类的类名,在catch语句块内部书写出现该类型的异常时的处理代码。

    程序执行到try-catch语句时,如果没有发生异常,则完整执行try语句块内部的所有代码,而catch语句块内部的代码不会执行,如果在执行时发生异常,则从发生异常的代码开始,后续的try语句块代码不会执行,而跳转到该类型的异常对应的catch语句块中。

    示例代码如下:

                   String s = "123";

                   try{

                            int n = Integer.parseInt(s);

                            System.out.println(n);

                   }catch(NumberFormatException e){

                            System.out.println(" 该字符串无法转换! ");

                   }

    在该示例代码中,Integer类的parseInt方法可能会抛出NumberFormatException,因为parseInt方法的声明如下:

    public static int parseInt(String s) throws NumberFormatException

    这里字符串s转换为int没有发生异常,则程序执行完try语句块内部的代码,程序的运行结果为:

    123

    如果将字符串对象s的值修改为“abc”,则运行上面的代码,则parseInt方法执行时将抛出NumberFormatException,则调用parseInt方法语句后续的try语句块中的代码不会执行,程序的执行流程跳转到捕获NumberFormatException异常的catch语句块内部,然后执行该catch语句块内部的代码,则程序的执行结果是:

    该字符串无法转换!

    这就是最基本的捕获异常和异常处理的代码结构。使用try语句捕获程序执行时抛出的异常,使用catch语句块匹配抛出的异常类型,在catch语句块内部书写异常处理的代码。

    在实际程序中,也可以根据异常类型的不同进行不同的处理,这样就需要多个catch语句块,其结构如下:

                   try{

                            // 逻辑代码

                   } catch( 异常类名 1 参数名 1){

                            // 处理代码 1

                   } catch( 异常类名 2 参数名 2){

                            // 处理代码 2

                   }

                   ……

                   }catch( 异常类名 n 参数名 n){

                            // 处理代码 n

                   }

         例如:

                   String s = "123";

                   try{

                            int n = Integer.parseInt(s);

                            System.out.println(n);

                            char c = s.charAt(4);

                            System.out.println(c);

                   }catch(NumberFormatException e){

                            System.out.println(" 该字符串无法转换! ");

                   }catch(StringIndexOutOfBoundsException e){

                            System.out.println(" 字符串索引值越界 ");

                   }

    在执行时,按照catch语句块书写的顺序从上向下进行匹配,直到匹配到合适的异常就结束try-catch语句块的执行。

    在实际执行时,就可以根据捕获的异常类型不同,书写不同的异常处理的代码了。使用该语法时需要注意,如果这些异常类直接存在继承关系,则子类应该书写在上面,父类应该书写在下面,否则将出现语法错误。例如:

                   String s = "123";

                   try{

                            int n = Integer.parseInt(s);

                            System.out.println(n);

                            char c = s.charAt(4);

                            System.out.println(c);

                   }catch(Exception e){

                           

                   }catch(NumberFormatException e){ // 语法错误,异常已经被处理

                            System.out.println(" 该字符串无法转换! ");

                   }catch(StringIndexOutOfBoundsException e){ // 语法错误,异常已经被处理

                            System.out.println(" 字符串索引值越界 ");

                   }

    这里Exception类是所有异常类的父类,在匹配时可以匹配到所有的异常,所有后续的两个异常处理的代码根本不会得到执行,所以将出现语法错误。正确的代码应该为:

                   String s = "123";

                   try{

                            int n = Integer.parseInt(s);

                            System.out.println(n);

                            char c = s.charAt(4);

                            System.out.println(c);

                   }catch(NumberFormatException e){

                            System.out.println(" 该字符串无法转换! ");

                   }catch(StringIndexOutOfBoundsException e){

                            System.out.println(" 字符串索引值越界 ");

                   }catch(Exception e){

                           

                   }

    如果在程序执行时,所有的异常处理的代码都是一样的,则可以使用Exception代表所有的异常,而不需要一一进行区分,示例代码如下:

                   String s = "123";

                   try{

                            int n = Integer.parseInt(s);

                            System.out.println(n);

                            char c = s.charAt(4);

                            System.out.println(c);

                   }catch(Exception e){

                            // 统一的处理代码

                   }

    在实际使用时,由于try-catch的执行流程,使得无论是try语句块还是catch语句块都不一定会被完全执行,而有些处理代码则必须得到执行,例如文件的关闭和网络连接的关闭等,这样如何在try语句块和catch语句块中都书写则显得重复,而且容易出现问题,这样在异常处理的语法中专门设计了finally语句块来进行代码的书写。语法保证finally语句块内部的代码肯定获得执行,即使在try或catch语句块中包含return语句也会获得执行,语法格式如下:

                   finally{

                            // 清理代码

                   }

    该语法可以和上面的两种try-catch语句块匹配,也可以和try语句匹配使用,和try语句块匹配的语法格式如下:

                   try{

                            // 逻辑代码

                   }finally{

                            // 清理代码

                   }

    这样在执行时,无论try语句块中的语句是否发生异常,finally语句块内部的代码都会获得执行。

    而只书写finally而不书写catch则会导致异常的丢失,所以最常用的异常处理的语法格式还是如下语法:

                   try{

                            // 逻辑代码

                   }catch( 异常类名 参数 ){

                            // 异常处理代码

                   }finally{

                            // 清理代码

                   }

    这样就是整个异常处理部分的逻辑代码、异常处理代码和清理的代码成为一个整体,使得程序代码更加显得紧凑,便于代码的阅读和使用。

    最后,介绍一下使用异常处理语法时需要注意的问题:

    1、书写在try语句块内部的代码执行效率比较低。所以在书写代码时,只把可能出现异常的代码书写在try语句块内部。

    2、如果逻辑代码中抛出的异常属于RuntimeException的子类,则不强制书写在try语句块的内部,如果抛出的异常属于非RuntimeException的子类,则必须进行处理,其中书写在try语句块是一种常见的处理方式。

    3、catch语句块中只能捕获try语句块中可能抛出的异常,否则将出现语法错误。

共3页 首页 上一页 1 2 3 下一页 尾页 跳转到
相关内容
赞助商链接