Java异常机制
异常类(Exception)和错误类(Error)都继承自Throwable类。
一、格式:
五个重要关键词try,catch,finally,throw,throws
try { // 可能发生异常的代码 } catch (异常类型1 异常对象1){ // 异常处理代码 } catch (异常类型2 异常对象2){ //异常处理代码 }
try:试试某段代码里是否含有异常。
catch:捕获异常。后面对应异常类型和一个代码块,用于表明该catch块用于处理这种类型的代码块,可以有多个catch块。
finally:总会被执行的代码。主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
throw:用于抛出一个实际的异常,可以单独作为语句使用,抛出一个具体的异常对象。
throws:用在方法签名中,用于声明该方法可能抛出的异常。
二、抛出异常:
1.throws抛出异常:
如果我们定义的一个方法可能会出现异常,但没有能力去处理这个异常,这时我们可以用throws抛出异常,交给这个方法的调用者去处理(当然如果调用者也不想处理,也可以继续抛出,最终JVM会处理)。比如:汽车在运行时可能出现异常,但汽车没有自己处理的能力,它就会把异常抛给开车的人处理(方法调用者)。
public class TestException { static void pop() throws NegativeArraySizeException { // 定义方法并抛出NegativeArraySizeException异常 int[] arr = new int[-3]; // 创建数组 } public static void main(String[] args) { // 主方法 try { // try语句处理异常信息 pop(); // 调用pop()方法 } catch (NegativeArraySizeException e) { System.out.println("pop()方法抛出的异常");// 输出异常信息 } } }
定义方法pop()时预测到可能会出现NegativeArraySizeException类型的异常,但它假如无力处理异常,所以就把异常抛出,谁调用它谁就处理这个异常。
2.throw抛出异常对象:
throw抛出的是一个具体的异常对象,程序在执行了throw之后会立即跳出语句所在的方法,因此throw后面不允许有别的语句,否则程序会在编译时出错。
三、常见异常:
1. runtimeException子类:
1、 java.lang.ArrayIndexOutOfBoundsException
数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。
2、java.lang.ArithmeticException
算术条件异常。譬如:整数除零等。
3、java.lang.NullPointerException
空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等
4、java.lang.ClassNotFoundException
找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。5、java.lang.NegativeArraySizeException 数组长度为负异常
6、java.lang.ArrayStoreException 数组中包含不兼容的值抛出的异常
7、java.lang.SecurityException 安全性异常
8、java.lang.IllegalArgumentException 非法参数异常
2.IOException
IOException:操作输入流和输出流时可能出现的异常。
EOFException 文件已结束异常
FileNotFoundException 文件未找到异常
3. 其他
ClassCastException 类型转换异常类
ArrayStoreException 数组中包含不兼容的值抛出的异常
SQLException 操作数据库异常类
NoSuchFieldException 字段未找到异常
NoSuchMethodException 方法未找到抛出的异常
NumberFormatException 字符串转换为数字抛出的异常
StringIndexOutOfBoundsException 字符串索引超出范围抛出的异常
IllegalAccessException 不允许访问某类异常
InstantiationException 当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常
四、异常对象包含的常用方法:
1. getMessage();返回该异常的详细描述字符
2. printStackTrace():将该异常的跟踪栈信息输出到标准错误输出。
3. printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定的输出流
4. getStackTrace():返回该异常的跟踪栈信息。
五、自定义异常: