Java的异常机制主要依赖于try,catch,finally,throw和throws五个关键字。
try:后紧跟一个花括号括起来的代码块(花括号不可以省略),简称try块,它里面放的是可能引发异常的代码块。
catch:后面对应异常类型和代码块,用于表明该catch块用于处理这种类型的代码块。
finally:多个catch块后还可以跟一个finally块,finally块用于回收在try块里打开的物理资源,异常机制会保证finally块总被执行。
throws:主要在方法签名中使用,用于声明该方法可能抛出的异常。
throw:用于抛出一个实际的异常,throw可以单独作为语句使用,抛出一个具体的异常对象。
异常处理机制:
目的:让程序具有极好的容错性,增加程序的健壮性。(当程序出现意外清醒时,系统会自动生成一个Exception对象来通知程序,实现了“业务功能实现代码”和“错误处理代码”分离),为程序提供更好的可读性。
将系统的业务实现代码放在try块中定义,所有的异常处理逻辑放在catch块中进行处理。
try{
//业务实现代码
……
}
catch(Exception e){
alert 输入不合法
goto retry;
}
抛出异常:如果执行try块里的业务逻辑代码时出现异常,系统自动生成一个异常对象,该异常对象被提交给Java运行时环境。
捕获异常:当java运行时环境收到异常对象时,会寻找能处理该异常对象的catch块,如果找到合适的catch块,则把该异常对象交给catch块处理。
异常类的继承体系:当Java运行时环境接收到异常对象后,会依次判断该异常对象是否是catch块后异常类或者其子类的实例,如果是,Java运行时环境将调用该catch块来处理该异常,否则再次拿该异常对象和下一个catch块里的异常类进行比较。
注:try块后的花括号不可以省略,即使try块里只有一行代码,也不可以省略花括号,catch块后的花括号也不可以省略,try块里声明的变量是代码块局部变量,它只在try块内有效,在catch块中不能访问该变量。
Java把所有的非正常情况分为两种:异常(Exception),错误(Error)
Error错误:一般是指与虚拟机相关的问题(系统崩溃,虚拟机错误,动态链接失败等),这种错误无法恢复或者不可能捕获,导致程序中断。因此应用程序不应该试图使用catch块来捕获Error对象。
进行异常捕获时应该将所有的父类异常的catch块排在子类异常的catch块后面(先处理小异常,再处理大异常)否则将会出现编译错误。
多异常捕获:
使用一个catch块捕获多种异常时注意:①捕获多种类型的异常时,多种异常类型之间用竖线(|)隔开。②捕获多种类型的异常时,异常变量有隐式的final修饰,因此程序不能对异常变量重新赋值。捕获一种类型的异常时,异常变量没有final修饰。
访问异常信息:
所有的异常对象都包含的常用方法:
getMessage():返回该异常的详细描述字符串。
printStackTrace():将该异常的跟踪栈信息输出到标准错误输出。
printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定输出流.
getStackTrace():返回该异常的跟踪栈信息。
使用finally回收资源:
Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只能回收堆内存中对象所占用的内存。
异常处理语法结构中只有try块是必须的,也就是说,如果没有try块,则不能有后面的catch块和finally块,catch块和finally块都是可选的,但catch块和finally块至少出现其中之一。可以有多个catch块,捕获父类异常的catch块必须位于捕获子类异常的后面,但是不能只有try块,既没有catch块,也没有finally块,多个catch块必须位于所有的catch块之后。如果在异常处理代码块中使用System.exit(1)语句来退出虚拟机,则finally块将会失去执行的机会。一旦在finally块中使用了return或throw语句,将会导致try块,catch块中的return,throw语句失效。
Checked异常和Runtime异常体系
java的异常被分为:Checked异常和Runtime异常(运行时异常),所有的RuntimeException类及其子类的实例被称为Runtime异常,不是RuntimeException类及其子类的异常实例则被称为Checked异常。checked异常是可以被修复的异常,所以Java程序必须显式地处理Checked异常。
Checked异常的处理方式:①当前方法明确知道如何处理该异常,程序应该使用try…catch块来捕获该异常,然后在对应的catch块中修复该异常。②当前方法不知道如何处理这种异常,应该在定义该方法时声明抛出该异常。
throws声明抛出只能在方法签名中使用,throws可以声明抛出多个异常类,多个异常类之间用逗号隔开,