前言
1. 学习视频:
尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)_哔哩哔哩_bilibili
2023最新Java学习路线 - 哔哩哔哩
第三阶段:Java高级应用
9.异常处理
10.多线程
11.常用类和基础API
12.集合框架
13.泛型
14.数据结构与集合源码
15.File类与IO流
16.网络编程
17.反射机制
18.JDK8、17 新特性
正文
9.异常处理
9.1异常的理解、体系结构
栈内存溢出:循环递归没有出口,一直自我调用,导致栈内存满了,就溢出了。
堆内存溢出:堆初始化时 设置的存储空间大小 比 向里面存储的内容小,就会溢出。
9.2 常见的异常
JAVA基础——常见异常
高级异常JVM异常,要学习JVM相关知识
9.3 处理异常
9.3.1 捕获异常(try-catch-finally) (抓抛模型) (处理运行时异常)
finally的使用:
final、finally、finalize的区别:
1、final修饰符(关键字)。被final修饰的类,就意味着不能再派生出新的子类,不能作为父类而被子类继承。因此一个类不能既被abstract声明,又被final声明。将变量或方法声明为final,可以保证他们在使用的过程中不被修改。被声明为final的变量必须在声明时给出变量的初始值,而在以后的引用中只能读取。被final声明的方法也同样只能使用,即不能方法重写。
2、finally是在异常处理时提供finally块来执行任何清除操作。不管有没有异常被抛出、捕获,finally块都会被执行。try块中的内容是在无异常时执行到结束。catch块中的内容,是在try块内容发生catch所声明的异常时,跳转到catch块中执行。finally块则是无论异常是否发生,都会执行finally块的内容,所以在代码逻辑中有需要无论发生什么都必须执行的代码,就可以放在finally块中。
3、finalize是方法名。java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者被执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。
9.3.2 抛出异常 (throws+异常类型) (处理编译时异常)
抛出方法异常(暂时不处理),后续调用这个方法的时候还会爆出编译异常,只要调用,就会异常。
9.3.3 异常处理方式的选择:
9.3.4 手动抛(throw + 异常类型的对象) (不满足具体场景的开发问题,不满足某一类异常)
异常类的对象:可以是编译时异常,也可以是运行时异常,还可以是他们的子类。
抛出运行时异常,可以处理,可以不处理。如下:
抛出编译异常,必须要处理:在调用者main方法使用try...catch 或 在本方法声明的位置中使用throws。
抛出异常之后,这个方法就不继续向后执行了,只是把异常抛给了调用者。
throw 和 throws 的区别:
throw:使用在方法内部,后面加异常处理的对象,表示不满足指定异常类型,但是手动抛出指定的一个异常对象。是一个产生异常对象的方式。抛运行时异常可以不处理,抛编译异常必须处理。
throws:使用在方法的声明的位置,把产生的异常对象继续向上一层调用此方法的对象抛出。属于异常处理的方式之一。到main方法必须要处理throws的异常,不能再继续向上抛异常。
9.3.5 自定义异常类型
我们发现,Exception中继承异常父类对应的根父类Throwable。然后有几个不同参数类型或参数个数的重载的构造器。那么,我们可以参照这个,写我们自定义的异常类:
新建一个异常类,然后让他继承一个异常类型。(Exception中,除了RuntimeException运行时异常以外,其他都是编译时异常。所以可以继承Exception或RuntimeException)。写上序列版本号,再写几个重载的构造器。
自定义异常类型举例: