新朋友关注“尚学堂java培训”轻松学编程知识
即使在编译时没有错误信息产生,但在程序运行时,经常会出现一些运行时的错 误,这种错误对 Java 而言是一种异常。有了异常就要有相应的处理方式。本文章将介绍异常的基本概念以及相关的处理方式。(爱学习的堂粉们要专心哦)
一、异常的基本概念
异常也称为例外,是在程序运行过程中发生的、会打断程序正常执行的事件,下面是几种常见的异常;
1、 算术异常(ArithmeticException)。
2、 没有给对象开辟内存空间时会出现空指针异常(NullPointerException)。
3、 找不到文件异常(FileNotFoundException)。
所以在程序设计时,必须考虑到可能发生的异常事件,并做出相应的处理。这样才能保证程序可以正常运行。
Java 的异常处理机制也秉承着面向对象的基本思想。在 Java 中,所有的异常都是以类的类型存在,除了内置的异常类之外,Java 也可以自定义的异常类。此外,Java 的异常处理机制也允许自定义抛出异常。关于这些概念,将在后面介绍。
1、为何需要异常处理?
在没有异常处理的语言中,就必须使用 if 或 switch 等语句,配合所想得到的错误 状况来捕捉程序里所有可能发生的错误。但为了捕捉这些错误,编写出来的程序代码 经常有很多的 if 语句,有时候这样也未必能捕捉到所有的错误,而且这样做势必导致 程序运行效率的降低。
Java 的异常处理机制恰好改进了这一点。它具有易于使用、可自行定义异常类,处理抛出的异常同时又不会降低程序运行的速度等优点。因而在 Java 程序设计时,应 充分地利用 Java 的异常处理机制,以增进程序的稳定性及效率。
2、简单的异常范例
Java 本身已有相当好的机制来处理异常的发生。本节先来看看 Java 是如何处理异常的。TestException7_1 是一个错误的程序,它在访问数组时,下标值已超过了数组下标所容许的最大值,因此会有异常发生:
范例:TestException7_1.java
01 public class TestException7_1
02 {
03 public static void main(String args[])
04 {
05 int arr[]=new int[5]; // 容许 5 个元素
06 arr[10]=7; // 下标值超出所容许的范围
07 System.out.println(“end of main() method !!”);
08 }
09 }
在编译的时候程序不会发生任何错误,但是在执行到第 6 行时,会产生下列的错误信息:
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 10 at TestException7_1.main(TestException7_1.java:6)
错误的原因在于数组的下标值超出了最大允许的范围。Java 发现这个错误之后, 便由系统抛出“ArrayIndexOutOfBoundsException”这个种类的异常,用来表示错误的原因,并停止运行程序。如果没有编写相应的处理异常的程序代码,则 Java 的默认异 常处理机制会先抛出异常、然后停止程序运行。
二、异常处理方法
通过上一篇文章的范例显示:TestException7_1 的异常发生后,Java 便把这个异常抛了出来,可是抛出来之后没有程序代码去捕捉它,所以程序到第 6 行便结束,因此根本不会执行到第 7 行。如果加上捕捉异常的程序代码,则可针对不同的异常做妥善的处理。这种处理的方式称为 异常处理。异常处理是由 try、catch 与 finally 三个关键字所组成的程序块,其语法如下: 【 格式1:异常处理的语法】
格式1的语法是依据下列的顺序来处理异常:
1、 try 程序块若是有异常发生时,程序的运行便中断,并抛出“异常类所产生的对象”。
2、 抛出的对象如果属于catch()括号内欲捕获的异常类,则catch会捕捉此异常,然后进到 catch 的块里继续运行。
3、 无论 try 程序块是否有捕捉到异常,或者捕捉到的异常是否与catch()括号里的异常相同,最后一定会运行finally块里的程序代码。
finally 的程序代码块运行结束后,程序再回到 try-catch-finally 块之后继续执行。 由上述的过程可知,异常捕捉的过程中做了两个判断:第一个是 try 程序块是否有异常产生,第二个是产生的异常是否和 catch()括号内欲捕捉的异常相同。 值得一提的是,finally 块是可以省略的。如果省略了 finally 块不写,则在 catch() 块运行结束后,程序跳到 try-cath 块之后继续执行。 根据这些基本概念与运行的步骤,可以绘制出如图 1 所示的流程图:
图1:异常处理的流程图
在格式1中,异常类”指的是由程序抛出的对象所属的类,例如 TestException7_1 中出现的“ArrayIndexOutOfBoundsException”就是属于异常类的一种。至于有哪些异 常类以及它们之间的继承关系,稍后本书将会做更进一步的探讨。下面的程序代码加入了 try 与 catch,使得程序本身具有捕捉异常与处理异常的能力。
范例:TestException7_2.java
01 public class TestException7_2
02 {
03 public static void main(String args[])
04 {
05 try // 检查这个程序块的代码
06 {
07 int arr[]=new int[5];
08 arr[10]=7; // 在这里会出现异常
09 }
10 catch(ArrayIndexOutOfBoundsException e)
11 {
12 System.out.println(“数组超出绑定范围!”);
13 }
14 finally // 这个块的程序代码一定会执行
15 {
16 System.out.println(“这里一定会被执行!”);
17 }
18 System.out.println(“main()方法结束!”);
19 }
20 }
输出结果:
数组超出绑定范围!
这里一定会被执行!
main()方法结束!
程序说明:
1、 程序第 7 行声明一 arr 的整型数组,并开辟了 5 个数据空间。
2、 程序第 8 行为数组中的第 10 个元素赋值,此时已经超出了该数组本身的范围,所 以会出现异常。发生异常之后,程序语句转到 catch 语句中去处理,程序通过 finally 代码块统一结束。
上面程序的第 5~9 行的 try 块是用来检查是否会有异常发生。若有异常发生,且 抛出的异常是属于 ArrayIndexOutOfBoundsException 类,则会运行第 10~13 行的代码 块。因为第 8 行所抛出的异常正是 ArrayIndexOutOfBoundsException 类,因此第 12 行 会输出“数组超出绑定范围!”字符串。由本例可看出,通过异常的机制,即使程序 运行时发生问题,只要能捕捉到异常,程序便能顺利地运行到最后java数组定义的几种方式,且还能适时的加 入对错误信息的提示。
程序 TestException7_2 里的第 10 行,如果程序捕捉到了异常,则在 catch 括号内 的异常类 ArrayIndexOutOfBoundsException 之后生成一个对象 e,利用此对象可以得到 异常的相关信息,下例说明了类对象 e 的应用:
范例:TestException7_3.java
01 public class TestException7_3
02 {
03 public static void main(String args[])
04 {
05 try
06 {
07 int arr[]=new int[5];
08 arr[10]=7;
09 }
10 catch(ArrayIndexOutOfBoundsException e){
11 System.out.println(“数组超出绑定范围!”);
12 System.out.println(“异常:”+e); // 显示异常对象 e 的内容
13 }
14 System.out.println(“main()方法结束!”);
15 }
16 }
输出结果:
数组超出绑定范围!
异常:java.lang.ArrayIndexOutOfBoundsException: 10 main()方法结束!
例题 TestException7_3 省略了 finally 块java数组定义的几种方式,但程序依然可以运行。在第 10 行中,把 catch()括号内的内容想象成是方法的参数,而 e 就是 ArrayIndexOutOfBoundsException 类的对象。对象 e 接收到由异常类所产生的对象之后,就进到第 11 行,输出“数组超 出绑定范围!”这一字符串,而第 12 行则是输出异常所属的种类,也就是 java.lang. ArrayIndexOutOfBoundsException。而 java.lang 正是 ArrayIndexOutOfBoundsException 类所属的包。
三、异常处理机制的回顾
当异常发生时,通常可以用两种方法来处理,一种是交由 Java 默认的异常处理机 制做处理。但这种处理方式,Java 通常只能输出异常信息,接着便终止程序的运行。 如 TestException7_1 的异常发生后,Java 默认的异常处理机制会显示出:
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 10 at TestException7_1.main(TestException7_1.java:6)
接着结束 TestException7_1 的运行。
另一种是处理方式是自行编写的 try-catch-finally 块来捕捉异常,如 TestException7_2 与 TestException7_3。自行编写程序代码来捕捉异常最大的好处是: 可以灵活操控程序的流程,且可做出最适当的处理。图 7-2 绘出了异常处理机制的选 择流程。
图2:异常处理的方法
西安校区
Java培训脱产班开课时间:2017年02月28日抢座中..
电话:029-62258374
地址:陕西省西安市高新区科技二路西安软件园天泽大厦五楼
郑州校区
Java培训脱产班开课时间:2017年02月28日 抢座中..
电话:0371-58500958
地址:河南省郑州市金水区东风路与文化路交叉南100米
☆
科普一下什么是脱产班:
脱产班就是参加工作后再去校内进行学习
一种学习方式。其管理模式与高校普通班
级一样,学习期间完全脱离生产不在原单
位工作,全身心的进行全日制学习。不占
用学生周六和周日的工作时间,对学生有
正常的、相对固定的授课教室和管理要求
,有稳定的寒暑假安排。
一个有用的公众号
尚学堂java培训
Android
web前端
培训基地
长按关注
亲爱的同学们:
随着春节假期即将结束,尚学堂java培训春季班的课程也随之开始,试听的课程已经开启,希望小伙伴们注意自己的开课时间(打开【尚学堂java培训】公众号,点击-精品课程-我要试听-联系客服获取免费试听名额),不要错过咯,如果有疑问可到尚学堂服务中心前台咨询或致电029-62258374,地址:西安市雁塔区高新区科技二路天泽大厦五楼。
———END———
限 时 特 惠:本站每日持续更新海量各大内部创业教程,一年会员只需128元,全站资源免费下载点击查看详情
站 长 微 信:jiumai99