七、Java异常
1、Exception(异常)
是程序本身可以处理的异常,Exception类有一个重要的子类RuntimeException。RuntimeException类及其子类表示“JVM常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常NullPointerException、ArithmeticException和ArrayIndexOutOfBoundException。
(1)、Checked Exception(可查异常):Java中并没有一个名为Checked Exception的类。除了Exception中的RuntimeException及RuntimeException的子类以外都属于Checked Exception。它是在编程中使用最多的Exception,所有继承自Exception并且不是RuntimeException的异常都是Checked Exception。JAVA语言规定必须对Checked Exception作处理,编译器会对此作检查,要么在方法体中声明抛出Checked Exception,要么使用catch语句捕获Checked Exception进行处理,否则不会通过编译。常用的Checked Exception有IOException、ClassNotFoundException等。
(2)、Unchecked Exception(不可查异常):编译器不要求强制处置的异常。RuntimeException就是一种不可查异常,即表示编译器不会检查程序是否对RuntimeException作了处理,在程序中不必捕获RuntimException类型的异常,也不必在方法体声明抛出RuntimeException类。一般来说,RuntimeException发生的时候,表示程序中出现了编程错误,所以应该找出错误修改程序,而不是去捕获RuntimeException。常见的RuntimeException有NullPointException、ClassCastException、IllegalArgumentException、IndexOutOfBoundException等。
2、Error(错误)
表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件问题,是程序无法处理的错误。例如,Java虚拟机运行错误(Virtual MachineError),当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在Java中,错误通过Error的子类描述。
3、Exception特点
(1)、异常catch有顺序性:在catch异常时,如果有多个异常,那么是会有顺序要求的。子类型必须要在父类型之前进行catch,catch与分支逻辑是一致,如果父类型先被catch,那么后被catch的分支根本得不到运行机会。
(2)、异常被吃掉:如果在finally中有返回值(return语句),那么在程序中抛出的异常信息将会被吞噬掉。这是一个非常值得注意的问题,因为异常信息是非常重要的,在出现问题时,我们通常凭它来查找问题。
(3)、throw与throws的区别
①、位置不同
//方法参数小括号后面,后面跟的是一个或者多个异常类名且用逗号隔开,表示抛出异常并交给调用者去处理。
public InStockVo updateStockContainerByInStock(InStock inStock, InStockItem inStockItem) throws Exception {...}
//方法体内,表示抛出异常。
throw new ServiceException("参数为空");
②、使用throw时候,如果方法中有throw抛出RuntimeException及其子类,则声明上可以没有throws,如果方法中有throw抛出Exception及其子类,则声明上必须有throws。
使用throws时候,如果后面跟的是RuntimeException及其子类,则该方法可以不用处理,如果后面跟的是Exception及其子类,则必须要编写代码进行处理或者调用的时候抛出。
(4)、try-catch-finally-return的执行顺序
①、不管是否有异常产生,finally块中代码都会执行。
②、当try和catch中有return语句时,finally块仍然会执行。
③、finally是在return后面的表达式运算执行的,所以函数返回值在finally执行前确定的,无论finally中的代码怎么样,返回的值都不会改变,仍然是之前return语句中保存的值。
④、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。