在Java程序设计语言中,异常对象都是派生于Throwable类的一个实例。如果Java中内置的异常类不能够满足需求,用户可以创建自己的异常类。
try{
可能出现异常的语句
}catch(异常类型 异常对象){
处理异常
}catch(异常类型 异常对象){
处理异常
}[finally{不管是否出现异常,都会执行此句}]
如果在try块中产生了异常,则程序会跳转到catch语句中找到匹配的异常类型进行相应的处理。最后不管程序是否会产生异常,肯定会执行到finally语句,finally语句就作为异常的统一出口。
Error:指的是JVM错误,这个时候的程序并没有执行,无法处理。
Exception:指的是程序中出现的错误信息,可以进行异常处理。
Java语言规范将派生于Error类或RuntimeException类的多有异常称为未检查(unchecked)异常,所有其他的异常称为已检查(checked)异常。
Java的异常处理流程:
a) 如果程序中产生了异常,那么会自动的由JVM根据异常的类型实例化一个指定异常类的对象;
b) 如果程序中没有任何异常处理操作,则这个异常类的实例化对象将交给JVM进行处理,而JVM的默认处理方式就是将异常信息输出,而后中断程序执行;
c) 如果程序中存在了异常处理,会由try语句捕获产生的异常对象;
d) 与try之后的每一个catch进行匹配,如果匹配成功,则使用指定的catch进行处理,如果没有匹配成功,则向后面的catch继续匹配,如果没有任何的catch匹配成功,将交给JVM执行默认处理;
e) 不管是否有异常都会执行finally程序,如果此时没有异常,执行完finally会继续执行程序中的其他代码,如果此时有异常没能够处理(没有一个catch可以满足)。那么也会执行finally,但是执行完finally后,将交给JVM执行默认处理。
注意:在Java中,所有捕获范围小的异常类型,必须放在捕获范围大的异常类型前,否则会在编译的时候报错。
Throws关键字主要是在方法的定义上使用的,表示此方法不进行异常的处理,而交给被调用处处理。
throw和throws的区别:
a) Throw:用户手工抛出异常类的实例化对象;
b) Throws:用于方法的声明上,表示此方法不处理异常,而将异常交给程序被调用处处理。
a) 异常(Exception)表示程序运行过程中可能出现的非正常状态,运行时异常(RuntimeException)表示虚拟机的通产操作中可能遇到的异常,是一种常见运行错误。Java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常,即Exception定义了必须处理的异常,而RuntimeException定义的异常可以选择性的进行处理。
b) RuntimeException是Exception的子类;
c) 常见的RuntimeException有NumberFormatException、ClassCastException、NullPointerException、ArithmeticException和ArrayIndexOutOfBoundsException。
创建自己的异常类,需要做的是定义一个派生于Exception的类,或者派生于Exception子类的类。
断言指的是程序执行到某行后,其结果一定是预期的结果。
么时候使用assert?
Assert(断言)在软件开发中是一种常见的调试方式,很多开发语言都支持这种机制。在实际使用中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个Boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。Assertion检查通常在开发和测试时开启,为了提高性能,在项目发布后,assertion检查通常是关闭的。