------- android培训、java培训、期待与您交流! ----------
异常总结:
(1)异常:简单而言就是程序出现的不正常的情况。
(2)异常的体系结构:
异常有很多种形式,我们按照面向对象的思想将它们的共性的东西抽取成一个类进行描述,
这个类就叫做异常类,将多个异常类不断向上抽取,就形成了异常体系。
Throwable:
Error:是Throwable的子类,用于指示合理的应用程序不应该试图捕获的严重问题。
比如说:内存泄露OutOfMemoryError,因为内存溢出或没有可用的内存提供给垃圾回收器时,
Java 虚拟机无法分配一个对象,这时抛出该异常。
Exception:类及其子类是Throwable的一种形式,它指出了合理的应用程序想要捕获的条件。
如: ArithmeticException:算术除零异常;
ClassNotFoundException :找不到指定名称的类的定义异常
Java.util.InputMismatchException:输入不匹配异常;
举例:比如人感冒了是发生了Exception异常,而得了非典就是Error了。
(3)jvm对异常的处理机制
交给jvm自己进行处理。采用的是jvm的默认处理方式。
其实就是相当于调用了异常对象的printStackTrace()方法,它会把异常的类名,原因,位置输出。
(4)如何进行异常处理:
A: 三种常用的格式:
try...catch...finally 处理
try...catch...catch... (finally)
try...finally
另外作为平级的异常在JDK7以后,有一个新特性:
try...catch(异常1 | 异常2 | ... e){}
B:抛出
(5)finally的使用:
finally:它里面的代码一定会执行。一般用来释放资源等,
特殊情况:在执行在finally之前,jvm退出了System.exit(0),非 0 的状态码表示异常终止。
(6)Exception和RuntimeException的区别
A:Exception 编译期间异常,该异常在编译时,如果没有处理(没有抛也没有try),编译失败。
B:RuntimeException 运行时异常,在编译期间是不报错的。在编译时,不需要处理,编译器不检查。
建议不处理而让程序停止,需要对代码进行修正。
(7)throws和throw的区别?
A:throws是标识方法有异常,用在方法上,后面跟的是异常类名。
throws后面可以跟Exception,调用者是必须进行异常处理的。
也可以跟RuntimeException,调用者可以不用处理。这个时候的方法内部可能有没有throw。
B:throw是抛出异常,用在方法内,后面跟的是对象名,它可以抛自定义异常。
throw后面可以跟Exception,那么,该方法必须使用throws声明异常。
也可以跟RuntimeException,不用声明异常。也就是说throw不一定有throws。
(8)如何自定义异常
步骤1:自定义异常的类继承Exception或者RuntimeException的子类。
步骤2:显式的写出空参数构造器,并写出一个带参数的构造器,一般参数类型是String,用于描述自定义异常的信息。
步骤3:在带参的构造器中,调用父类的构造器,并将该参数传递给父类的该构造器。
步骤4:在测试类中通过throw抛出自定义异常对象,并根据是否是RuntimeException或者Exception的子类决定是否在方法上throws声明;
案例如下:
package day12.BaseStudy;
import java.lang.reflect.Array;
/**
* @author Pony
* @version JDK1.6 对自定义异常进行测试的类
*/
public class MyExceptionTest {
public static void main(String[] args) {
String s = "abcd";//不符合参数类型
int[] arr = {1,2,3,4,5};
try {
printArray(arr); //符合参数类型,程序正常执行
printArray(s); //s不符合参数类型,发生异常
} catch (MyException e) {
e.printStackTrace(); //捕获异常
//e.getMessage();
}
System.out.println("over");
}
// 打印数组的方法,如果传递的参数不是数组,则抛出自定义异常
public static void printArray(Object obj) throws MyException {
Class<? extends Object> clazz = obj.getClass();
if (!clazz.isArray()) { //判断是否是数组类型
throw new MyException("发生自定义异常,请传递正确的参数!");
} else {
int len = Array.getLength(obj);
System.out.print("[");
for (int i = 0; i < len; i++) {
if(i!=len-1){
System.out.print(Array.get(obj, i)+",");
}else{
System.out.print(Array.get(obj, i)+"]");
}
}
System.out.println();
}
}
}
结果如下:
[1,2,3,4,5]
day12.BaseStudy.MyException: 请传递参数进来!
at day12.BaseStudy.MyExceptionTest.printArray(MyExceptionTest.java:24)
at day12.BaseStudy.MyExceptionTest.main(MyExceptionTest.java:13)
(9)面试题:finally里面的代码会不会改变catch里面返回的数据值?
finally里面的代码是在catch里面的return代码的中间执行的,
程序的执行过程可以通过eclipse断点查看。具体执行流程请看图。