- 异常概念:
- Throwable类是JAVA语言所有错误或异常的父类。
- Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理。
- Exception:因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:空指针访问、试图读取不存在的文件、网络连接中断。
- CheckedException:Java编译器会检查它。 在编译某个程序的时候有可能会有这样那样的事情发生,这样的异常就必须在编译的时候处理,如果不处理编译通不过(Java程序必须显式处理,否则程序就会发生错误,无法通过编译)。
- RuntimeException:程序员所犯的错误,需要修改代码(无需显式处理,也可以和编译时异常一起处理)。Java编译器不会检查它。
- 异常处理方式:
- 捕捉异常(try-catch-finally)。
格式1: try { //检测异常,包含可能会出现异常的代码以及声明异常的方法 } catch (ClassCastException e) { //捕获子类异常,并进行处理 } catch(Exception ex) { //捕获父类异常,并进行处理 } //catch多个同类型异常,则子类异常在前,父类异常在后,不然会导致编译错误!!!! //因为父类异常包括了子类异常,如果父类异常在前,子类异常永远catch不到,导致有时候无法准确描述错误信息! ----------------------------------------------------------------------------------------- 格式2: try { //检测异常,包含可能会出现异常的代码以及声明异常的方法 } catch(Exception ex) { //捕获异常,并进行处理 } finally { //释放资源,被finally控制的语句体一定会执行 } ----------------------------------------------------------------------------------------- 格式3: try { //检测异常,包含可能会出现异常的代码以及声明异常的方法 } finally { //释放资源,被finally控制的语句体一定会执行 } ----------------------------------------------------------------------------------------- 流程控制: 如果try失败了,抛出异常。流程会马上转移到catch块。 当catch块完成时,会执行finally块。 当finally完成时,就会继续按顺序执行其余的部分。 如果try成功了,流程会跳过catch块,并转移到finally块。 当finally完成时,就会继续按顺序执行其余的部分。
- 抛出异常(throws / throw)。
throws: 主要在方法的声明上使用,表示方法中不处理异常,而交给调用方处理。 实际上对于Java程序来讲,如果没有加入任何的异常处理,默认由JVM进行异常的处理操作。 (throws表示出现异常的一种可能性,并不一定会发生这些异常;) 方法可以抛出多个对象,但该方法的声明必须要含有全部可能的异常。 (若两个或两个以上的异常有共同的父类时,可以只声明父类异常) 方法抛出异常时,方法会从栈上立即被取出,而异常会再度丢给栈上的方法,也就是调用方。 如果调用方也只在声明时抛出异常,而不是try-catch,则调用方也会从栈中被取出,异常再度抛给此时栈上方的方法, 如此一路下去。 ----------------------------------------------------------------------------------------- throw: 表示在方法中手动抛出一个异常。 因为从异常处理机制来看,所有的异常一旦产生之后,实际上抛出的就是一个异常类的实例化对象。 一旦被执行,程序就会立即转入异常处理阶段,后面的语句就不再执行了,所在的方法不再返回有意义的值。 (throw则是抛出了异常,执行throw则一定抛出了某种异常对象) ----------------------------------------------------------------------------------------- 格式: 修饰符 方法名(参数)throws 异常类1,异常类2,....{ //有风险的程序 throw new 异常类(); }
- 注意点:
- 客户端开发,一般用try-catch处理异常;服务端开发,一般都是底层开发,由底层往上抛。
- 在编写可能会抛出异常的方法时,则必须在声明的同时抛出异常。
- 当catch的代码执行结束以后,不会回到try语句去执行尚未执行的代码。
- try、catch和finally都不能单独使用,只能是try-catch、try-finally或者try-catch-finally。
- try与catch之间不能有程序。
- 若某方法只带有try与finally,则该方法必须在声明的同时抛出异常。
- 不管是否发生了异常,即使try和catch块中存在return语句,finally都必须要执行!流程会跳到finally然后再回到return。
- finally语句块只有一种情况是不会执行的,那就是在执行finally之前遇到了System.exit(0)结束程序运行。
- 异常可以多态!声明为父类异常时,catch可以捕捉子类异常,throws可以抛出子类异常。P330
- try块中的局部变量和catch块中的局部变量(包括异常变量),以及finally中的局部变量,他们之间不可共享使用。
- 子类抛出的的异常与父类抛出的异常相同或者是父类抛出的异常的子类?
- 子类不能抛出父类没有的异常?
- 如果父类中被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常?
- 如果子类中有异常发生,那么子类只能try,不能throws?