《带你走进Java的世界》第四章相关学习笔记

异常并不是由程序员语法错误造成的,而是一种保护机制
比如数据库服务器坏了,通过异常我们可以捕获运行环境的异常并做出合理的处理动作。

初级开发-常规知识点

错误和异常

在语法里分别有Error类和Exception类对应错误和异常,它们都是Throwable类的子类。

常见的错误有内存不足,方法调用栈溢出,对于错误导致的程序中断代码无法有效修复,一般建议直接终止程序
遇到异常,一般可以捕获和处理,然后让程序继续运行。比如“网络无法连接”,可以过10秒再尝试重新了解,而不是简单的终止程序。

异常处理定式

在项目中一般推荐使用try...catch...finally的用法。

  1. try{
  2. 需要监控的可能会抛出异常的代码块
  3. }
  4. catch(Exception e){
  5. 出现异常后的处理代码
  6. }
  7. finally{
  8. 回收资源的动作
  9. }

运行期异常

Exception是所有异常的父类,其子类包括数据库异常SQLException,读写异常IOException,运行期异常**RuntimeException**(比如零除、数组越界、空指针…)。

Exception in thread "main" Start
java.lang.ArrayIndexOutOfBoundsException: 4
    at RunTimeDemo.main(RunTimeDemo.java:5)

于其他异常不同的是,Java编译器并不强制要求我们用try语句捕获运行期异常,因为其一旦发生,程序就会立即终止而没有机会进入异常处理流程,在项目中要尽量避免引发这种异常。

throw,throws的差别

public class ThrowsDemo {
    //声明该函数会抛出异常
    public static void checkData(int data) throws Exception {
        if(data<0) 
            throw new Exception("Data Error");
    }
    public static void main(String args[]){
        try{
            checkData(-1);
        } 
        catch (Exception e){
            e.printStackTrace();//注意输出结果        
        }
        finally{}
    }
}

通过上述代码可以知道两者如何使用,总结:

  1. throws出现在方法声明处,throw出现在函数体
  2. 某个函数内部使用了throw抛出异常,外部一定要使用throws
  3. 某个函数声明了throws抛出异常,一定要使用try…catch包含调用的代码

高级开发-部分知识点

相比初级程序员,高级程序员写出的代码不仅能保证发生异常后程序继续运行,还能告诉使用者如何处理异常,此外,还能通过finally语句提升项目运行时的内存使用性能。

finally里该放内存回收相关代码

DEMO(如果try…catch部分里↓)

  1. 使用Connection对象连接使用库,且后面不会再用到这个连接对象,一定要在finally里关闭连接对象,否则该连接对象占用的内存资源无法被回收
  2. 使用IO对象进行读写,一定要在finally里关闭这些IO对象…
  3. 使用ArrayListLinkedListHashMap等集合对象,且以后不会用到,建议调用clear方法清空
  4. 有对象obj指向较大的内存空间(假设100M),且之后不用用到,建议写上obj=null,提升内存使用效率

    子类方法不该抛出比父类范围更广的异常

    class Base{
     void f() throws SQLException{    }
    }
    class Child extends Base{
     //覆盖了父类的f方法,但抛出的异常范围比SQLException要大 
     void f() throws Exception{    } //会报语法错
    }
    

    Java编译器遵循“父类方法应当充分考虑到运行环境的险恶程度”的是原则,父类需要考虑到,即包括子类可能出现的异常,因此制定了“子类方法不该抛出比父类范围更广的异常”这个语法点。

    ⭐要点归纳

  5. 尽量使用try…catch…finally

  6. 尽量减少用try监控的代码块(即不必要的代码)
  7. 先使用专业的异常处理,再用Exception兜底

    try{
     IO代码
     数据库连接代码
    }
    catch(IOException ioe) {处理IO异常的代码}
    catch(SQLException ioe) {处理数据库操作异常的代码}、
    catch(Exception ioe) {最后再用Exception这个异常基类}
    
  8. 在catch里别简单抛出异常,尽可能处理异常

    练习题

    image.png

IO操作之后有时间再补  ̄□ ̄||

参考&推荐

《带你走进Java的世界》