1 程序
所谓程序(软件),就是各种命令(指令)的集合。
2 异常
概念:异常就是程序在运行期间发生的不正常的事件,它会打断程序的正常执行的流程。
目的:学习异常就是能够利用异常设计出良好的应用程序(所谓良好的应用程序就是不能因为某个异常,导致整个应用无法使用)。
注意:Java本身就提供了处理异常的能力,我们学习异常就是学习如何利用这种能力,帮我们解决开发中异常的问题。
应捕获和处理那些已知如何处理的异常,而传递那些不知如何处理的异常。
3 异常处理机制
Java程序在执行过程中如果出现异常,会自动产生一个异常类对象,该异常对象将自动提交给JVM,这个过程称为抛出(throw)异常。
当JVM接受到异常对象时,会寻找能处理这一异常的代码并把当前的异常对象交给其处理,这一过程称为捕获(catch)异常和处理异常。
如果JVM找不到可以捕获异常的代码,则运行时系统将终止,相应的Java程序也将退出。
异常的处理方式有两种:
①捕获并处理:在异常的代码附近显示用try/catch进行处理(不合理),运行时系统捕获后会查询相应的catch处理块,再catch处理块中对该异常进行处理。
②查看发生异常的方法是否有向上声明异常,有向上声明,向上级查询处理语句,如果没有向上声明,JVM中断程序的运行并处理。用throws向外声明(合理的处理方法)
或者
①显示用try/catch进行处理(不合理)
try{
//可能会出现异常的代码段;
}catch(异常类型1 变量名){ //处理制定类型的异常
//对该类型异常的处理代码段;
e.printStackTrace();
}catch(){
}[finally{
//无论是否发生异常都要执行的代码段;
//经常用来清理资源
}]
②向上声明:用throws关键字,向外声明(合理的处理方法)
声明本方法可能会抛出的异常列表。
...方法名(参数列表) throws 异常类型1,异常类型2
向上声明是告诉本方法的调用者,在使用本方法时,应该对这些异常进行处理。
4 异常的分类
①根据严重程度:
错误(Error):这个级别的异常代码是无能为力,必须通过手动方式解决。JVM内部的严重问题。无法恢复。程序人员不用处理。
例如:JVM内部出错或者CPU资源耗尽等
异常(Exception):一般指的是编程过程中出现的一般性问题。 普通的问题。通过合理的处理,程序还可以回到正常执行流程。要求编程人员要进行处理。
例如:除数为0,数组下标越界
注意: Java程序员只能处理Exception,对Error无能为力。
②Exception根据编程划分:
受检异常(非RuntimeException):就是在编译期间就要处理的异常(javac)
非受检异常(RuntimeException):在运行期间需要处理的异常(java)
java.lang.RuntimeException类以及子类都属于非受检异常。
③Error和Exception的共同父类是 Throwable。(java.lang.Throwable)
5 try和catch
try{ … }语句包含了一段代码,这段代码就是一次捕获并处理异常的范围。
在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常做相应的处理。
在catch语句块中是对异常进行处理的代码,每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象。
在catch中声明的异常对象(catch(ExceptionName e))封装了异常事件发生的信息,在catch语句块中可以使用这个对象的一些方法获取这些信息。
如:getMessage() 方法,用来获得有关异常事件的字符串信息。printStackTrace() 方法,用来跟踪异常事件发生时执行堆栈的内容。
使用多重 catch 语句时,异常子类一定要位于异常父类之前。如果没有异常产生,所有的catch段的代码都会被忽略不执行。
6 finally
finally中的代码主要用来进行资源清理的工作,无论try语句块中是否有异常发生,位于finally中的代码都会被执行。
7 throw和throws(throw关键字用在方法代码中主动产生一个异常)用throw关键字来手动抛出一个异常,如果手动抛出的异常是一个受检异常,那么必须进行处理
如果方法代码中自行抛出的异常是受检异常,则这个方法要用throws关键字声明这个异常。
throws用来声明一个方法可能会抛出的所有异常。跟在方法签名的后面。throws可以声明方法可能会抛出一个或多个异常,异常之间用','隔开
如果声明的可能会抛出的异常是非受检的,该方法的调用者可以处理也可以不处理。
如果声明的可能会抛出的异常是受检的,该方法的调用者必须进行处理。
注:重写一个方法时,它所声明的异常范围不能被扩大。
8 自定义异常
自定义异常:当需要一些跟特定业务相关的异常信息类时。
可以继承继承Exception来定义一个受检异常。也可以继承自RuntimeException或其子类来定义一个非受检异常。
9 异常实践:
观察抛出的异常的名字和行号很重要。
应该捕获和处理那些已知如何处理的异常,传递那些不知如何处理的异常。
尽量减少try语句块的体积。
for(int i=1;i<=1000;i++){
try{
...
}catch(...)
}不合理
尽量减少try-catch语句的嵌套。
在catch块代码段中,应该打印除该异常的堆栈跟踪信息以方便调试。
10 JDK 7新增的特性6
在Java 7以前,每个catch块只能捕捉一个异常。从Java 7开始,一个catch块可以捕捉多个异常。语法:
catch(异常1 | 异常 2 | 异常3 ex)
{
}多个异常之间用竖线隔开
11 常见异常:
非受检的:NullPointerException,ClassCastException,ArrayIndexsOutOfBoundsException,ArithmeticException(算术异常,除0溢出)
受检:Exception,FileNotFoundException,IOException,SQLException.
12 调试: Debug 双击:加断点。
F6:下一步(单步执行)
F5:进入方法
F7:从方法返回
F8:下一个断点,如果没有下一个断点,就结束。