一、java异常处理机制:
java中所有异常的超类为Throwable,其下有两个子类Error和Exception
1、Error和Exception的区别?
Error是系统级错误,是Java运行环境内部错误或者硬件问题,不能指望程序来处理这样的问题,除了退出运行别无选择。它是java虚拟机抛出的,比如虚拟机内存溢出等 。
Exception是程序需要处理的异常,是由于程序设计的不完善而出现的问题,程序必须进行处理,比如空指针,下标越界等。通常我们程序中处理的异常都是Exception。
2、Exception分类:
1、编码时异常(检查异常)--CheckedException : java语言强制要求处理的所有非运行异常,比如IOException、SQLException等
2.运行时异常 -- RuntimeException :一般由程序逻辑错误引起的,比如算数异常,空指针异常。
3、异常图:
4、异常的处理方法:捕获、抛出
当我们调用一个含有throws声明异常抛出的方法时,编译器要求我们必须处理这个异常,否则编译不通过。 处理手段有两种:
1、使用try-catch捕获并处理这个异常。
2、使用throws声明该异常的抛出给调用者解决。 具体选取那种取决于处理异常的责任问题。
二、try-catch-finally捕获
1、try-catch:
一般情况下我们可以捕获一个超类异常:
1、当try中出现了几种不同的异常,但是他们的解决办法相同
2.在最后一个catch处捕获Exception可以避免因为一个未处理的异常导致程序中断
需要注意的是:多个catch的异常之间若存在继承关系,一定要先捕获子类异常,再捕获超类异常,否则编译不通过。
2、try-catch-finally:
finally是try catch中的最后一块,它可以直接跟在try后面,或跟在一个catch后面。
finally可以保证只要程序执行到try当中,无论try里面的语句是否抛出异常,finally中的代码都必须被执行(除程序直接退出外,如:System.exit(0)则不会执行finally中的代码。)
通常我们将释放资源这类操作放到finally中,比如IO操作后的关闭。
3、语法:
try {
//放入可能产生异常的代码,顺序执行
}catch ( Exception e){
//如果代码出现异常,则用catch捕获,()传递相应的异常类型实例化
}finally{
//执行了try或catch后必须执行finally
}
4、面试题:请分别说明:final,finally,finalize
① final:表示最终的,不可改变的,是一个修饰符。修饰类时为最终类,不可被继承;修饰方法时为最终方法,不可以被子类重写;修饰变量时,变量值不可以改变。
② finally:是java异常处理机制的最后一块,放在try/catch后.可以保证只要程序执行到try当中,无论try里面的语句是否抛出异常,除程序直接退出外,finally中的代码必定会被执行。
③ finalize:是Object类方法的一种,返回值为void。当垃圾回收器GC不确定存在该对象的更多应用时,由对象的垃圾回收器调用此方法进行回收。
5、两种try-finally易错题:
/*
测试try finally:
调用方法返回值是1:return返回值,顺序执行,try在前执行return 0后,执行finally中的return 1;
*/
public static int method2() {
try {
return 0;
}finally {
return 1;
}
}
/*
调用方法返回值是0:执行try后人会0,再执行finally,x++不会修改try中已经返回的x值;
*/
public static int method3() {
int x = 0;
try {
return x;
}finally {
x++;
}
}
三、AutoCloseable
JDK7后,推出了一个新特性:AutoCloseable 自动关闭特性 ,允许我们在IO操作中使用异常处理机制更简洁地完成最后的close操作 。
1、语法:
try(定义需要finally中调用close方法关闭的对象){ * IO操作 * }
catch(Exception e){ * ... * }
以上语法可以在try中的()定义并初始化对象的对象必须实现了java.io.AutoCloseable接口,否则编译不通过。
注意:javaIO中的流和RandomAccessFile都已经实现了这个接口。在try中的代码是编译器认可的,而不是虚拟机。 编译器在编译上述代码后会在编译后的.class文件中改回try-catch形式。
四、继承关系中的异常:
子类异常必须小于等于父类的异常,包括以下几种情况
public class Father {
public void doSome() throws IOException, AWTException{ }
}
classSon extends Father {
① 与父类抛出相同异常:
// public void doSome() throws IOException, AWTException{ }
② 不抛出任何异常
// public void doSome() { }
③ 抛出父类的部分异常
// public void doSome() throws IOException{ }
// public void doSome() throws IAWTException{ }
④ 抛出父类的子类异常
// public void doSome() throws FileNotFoundException { }
⑤ 抛出父类的部分异常+子类异常
// public void doSome() throws FileNotFoundException, AWTException { }
//
⑥ 超类没有的异常不可以抛出:
// public void doSome() throws SQLException { }//异常,父增或子减
⑦ 比超类大的异常不可以抛出:
// public void doSome() throws Exception{ }//异常,父增或子减
五、throw和throws
throw关键字,用来对外主动抛出一个异常。
1、通常以下两种情况,我们主动向外抛出异常
1、当程序遇到一个满足语法,但是不满足业务要求时,可以跑出一个异常告知调用者。 *
2、程序执行遇到一个异常,但是该异常不应当在当前代码片段被解决时,可以抛出给调用者。
2、 throw和throws区别及联系:
1、throw的位置在方法体里,后面跟的是异常类的实例; throws的位置在方法声明后,后面跟的是异常类名。
2、throw之后只能抛出一个异常,throws可以同时抛出多个异常,中间用,隔开。
3、throws可以和try-catch分情况使用,throw不可以。
4、联系:如果方法中有throw抛出的RuntimeException异常及其子类对象,则方法声明上可以没有throws; 除此之外,方法声明上必须有throws;
public void setAge(int age) throws IllegalAgeException {
if ( age<0 || age>200 ){
throw new IllegalAgeException("年龄不合法");
}else {
this.age = age;
}
}

本文详细介绍了Java异常处理机制,包括Error和Exception的区别、Exception的分类、异常处理方法以及try-catch-finally的使用。此外,还讨论了AutoCloseable接口在自动资源管理中的应用。最后,文章提到了在继承关系中如何正确处理异常以及throw和throws的用法。

1183

被折叠的 条评论
为什么被折叠?



