1、异常分类
java.lang.Throwable是所有异常的根
java.lang.Error是错误信息
java.lang.Exception是异常信息
2、首先介绍Exception
一个是运行时异常 RuntimeException ,这种异常是强制我们catch或throw的异常。
一 个是检查异常CheckedException,完全由虚拟机接管,也是继承自Exception的,只是虚拟机对这两种异常进行了区分。
2.1 Checked异常()
只有java语言提供了Checked异常,Java认为Checked异常都是可以被 处理的异常,所以Java程序必须显示处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误无法编译。这体现了Java的设计哲学:没有完善错误处理的代码根本没有机会被执行。()
主要包含: I/O 错误导致的 IOException、SQLException。
1. 试图在文件尾部读取数据
2. 试图打开一个错误格式的 UR
3. 试图根据给定的字符串查找 class 对象,而这个字符串表示的类并不存在
4. 对Checked异常处理方法有两种:
1 当前方法知道如何处理该异常,则用try...catch块来处理该异常。
2 当前方法不知道如何处理,则在定义该方法是声明抛出该异常。
两种方法:
// try...catch捕获并处理这个异常
try{
//try块中放可能发生异常的代码。
//如果执行完try且不发生异常,则接着去执行finally块和finally后面的代码(如果有的话)。
//如果发生异常,则尝试去匹配catch块。
}catch(SQLException SQLexception){
//每一个catch块用于捕获并处理一个特定的异常,或者这异常类型的子类。Java7中可以将多个异常声明在一个catch中。
//catch后面的括号定义了异常类型和异常参数。如果异常与之匹配且是最先匹配到的,则虚拟机将使用这个catch块来处理异常。
//在catch块中可以使用这个块的异常参数来获取异常的相关信息。异常参数是这个catch块中的局部变量,其它块不能访问。
//如果当前try块中发生的异常在后续的所有catch中都没捕获到,则先去执行finally,然后到这个函数的外部caller中去匹配异常处理器。 //如果try中没有发生异常,则所有的catch块将被忽略。
}catch(Exception exception){
//...
}finally{
//finally块通常是可选的。 //无论异常是否发生,异常是否匹配被处理,finally都会执行。
//一个try至少要有一个catch块,否则, 至少要有1个finally块。但是finally不是用来处理异常的,finally不会捕获异常。
//finally主要做一些清理工作,如流的关闭,数据库连接的关闭等。
}
//第二种 函数内部抛出,交给调用者来处理
public void save(User user)
{
if(user == null)
throw new IllegalArgumentException("User对象为空");
//......
}
2.2 RuntimeException
Runtime如除数是0和数组下标越界等,其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性和运行效率影响很大。
涉及到一知识点个了解一下就好,异常的冒泡,异常的冒泡是为了在当前发生异常的函数或者这个函数的caller中找到最近的异常处理程序,也就是报异常的地方是最近调用该函数的地方。
运行异常可能出现在任何地方,且出现频率很高,因此为了避免巨大的 系统资源开销,编译器不对异常进行检查,但如果不处理的话会导致程序终止。
所以由系统自动检测并将它们交给缺省的异常处理程序。当然如果你有处理要求也可以显示捕获它们。(出现的话基本上可以断定是程序员自己书写的错误)
主要包含:NullPointerException 、 ClassCastException(类型转换错误)、ArithmeticException(除数为零)
public void method3() throws RuntimeExceptio //直接在方法上抛出
也可以自定义声明
public void testMethod1_02()
{
throw new RuntimeException();//自己不处理,抛给调用者
}
3、Error
Error表示运行时系统的内部错误和资源耗尽错误,表示系统在运行期间出现了严重的错误,属于不可恢复的错误,由于这属于JVM层次的严重错误,因此这种错误会导致程序终止执行。程序对其不做处理。(一般和俺没关系)
一般包含:OutOfMemoryError(内存资源不足),NoClassDefFoundError(类定义错误)
4、Throw 和 throws 的区别
throws 用在函数上,后面跟的是异常类,让调用者知道该功能可能会出现的问题,只是表示了可能出现的异常。
public void doA(int a) throws Exception1,Exception3{……}
throw 用在函数内,后面跟的是异常对象。抛出具体的问题对象,执行到 throw,功能就已经结束了,跳转到调用者,并将具体的问题对象抛给函数调用者。throw表示已经出现了异常
if(a==0)
throw new Exception3("自定义异常");