Java中的异常处理机制:
当程序抛出异常后,程序从程序中导致异常的代码处跳出,java虚拟机检测寻找和try关键字匹配的处理该异常的catch块,如果找到了,就就爱那个控制权交到catch代码快,然后继续往下执行,try中大声异常的代码不会被重新执行。若果没有找到,在所有的finally块和当前线程所属的ThreadGroup的uncaughtException()被调用后,遇到异常的线程将被终止。
Thrwable:所有异常的父类,其下有子类Exception和Error
Error:java运行时环境出现的错误,我们不能控制
Exception:程序本身可以解决的异常,我们能够控制
try-catch:异常处理模块,若try块捕获到异常则到catch块中处理,否则跳过catch块
try{
可能出现异常的块
}catch(异常类型声明){
异常处理块
}catch(异常类型声明){
异常处理块
}finlly{
清理块
}
try代码块后面跟多个catch块时,java虚拟机会把实际抛出的异常对象一次和各个catch块声明的异常类型匹配,如果异常对象为某个异常类型或其子类实例,就执行这个catch块,而跳过其他的catch块。
try块后可以有0个或多个catch,只能有0个和1个finally。,但try块不能独立存在
如果有catch块,finally块跟在catch后,如果无,finally则跟在try后。
finally:一般定义在异常处理后,是异常处理中的一部分。无论try块是否出现异常都将无条件执行finally块语句,除非在finally块之前使用了System.exit()。finally块中不能出现return语句。它将改变我们的初衷。通常用finally语句来做清理工作,如:关闭流,释放连接等。
throw用于抛出异常。必须抛出Throwable的子类或是它本身的实例。其后不允许紧跟其他语句,因为紧跟的语句永不执行。
thorws:在方法声明处声明可能抛出的异常。
Throw的用法:
(1)在当前方法中出现了一个异常,但处理异常不应归当前方法管,则应抛出。
(2)当程序满足语法要求,但不符合业务逻辑,则应当主动抛出。
通常情况下,方法中若throws了一个异常程序,我们则必须处理该异常
throws的处理方法:
(1)为你的throws添加一个try-catch语句
(2)在方法上声明该类异常的抛出,以通知调用者。
(3)处理该类异常永远不要在main()上声明thorws。
当父类已经声明了一个throws时,子类在重写方法时的thorws时:
(1)可以不做处理
(2)可以仅仅在throws中声明父类异常的部分异常
(3)可以在throws中声明父类方法中抛出的异常的子类异常
但不可以做以下操作:
(1)在throws的声明中额外的异常抛出
(2)在thorws的声明中抛出父类异常的父类异常
Void printStackTrace():输出执行堆栈时的错误信息
String getMessage():获取有关异常事件的信息
Throwable getCause():获取该异常出现的原因
Java异常可以分为:可检测异常、非可检测异常
可检测异常(checkedException):可检测的异常经编译器验证,对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则,不捕捉这个异常,编译器就通不过,不允许编译。
非可检测异常(RuntimeException):不遵循处理或声明的规则,在产生异常时,不一定非要采取任何操作,编译器不会检查是否已解决了这个异常。
常见的异常:
IOException:操作输入流和输出流可能出现的异常(可检测异常)
RuntimeException异常有以下常用的:
ArithmeticException:数学异常,例如0被作为除数
NullPointException:空指针异常
InputOutOfBoundsException:下标越界异常
ClassCastException:类造型异常(类型转换异常)
IllegalArgumentException:非法参数异常