Java基础篇--异常学习笔记

异常

是指在程序执行过程中发生的非正常事件,这些事件的发生将中断程序的正常运行。Java用面向对象的方法处理异常,将处理异常的代码和正常的程序代码分开,使程序维护起来更加方便,也增强了程序的安全性和健壮性。

异常处理涉及两大基本问题:一是如何表示异常情况的问题;二是如何控制处理异常流程的问题。

java中定义了很多异常类,每个异常类都代表了一类运行错误,类中包含了该运行错误的信息和处理错误的方法等内容。

Java基础篇--异常学习笔记
所有的这些异常类都直接或间接继承自java.lang.Throwable类。

Throwable两个直接子类:
一、Error 错误 严重 通常指java系统或执行环境中发生的错误,是不可避免的(宇宙爆炸,不是不想处理,是没法处理。不用处理(具体如虚拟机崩溃,内存空间不足等))
二、Exception 异常,可以处理。表示程序本身可以处理的一般性异常

(1)RuntimeException及其子类 未检查(Unchecked)异常 , 指可以避免的异常,出现小瑕疵时的异常,由于程序自身问题导致产生的异常。(例如数组下标越界。该类异常在语法上不强制程序员必须处理,即使不处理这样的异常也不会出现语法错误。)


(2)非RuntimeException及其子类 已检查(Checked)异常 不可避免,必须处理。(例如文件不存在异常,该类异常在语法上强制程序员必须进行处理,如果不进行处理则会出现语法错误。)




有时也将派生于Error类或RuntimeException的所有异常成为未检查异常,所有其他异常称为已检查异常,一般来说,在编写的程序方法中必须对已检查异常予以处理(自行捕获处理或者声明让其调用者们去捕获),否则编译器就会给出一个错误消息。而未检查异常要么不可控制(error),要么就应该避免发生(RuntimeException)

异常的产生:​ throw 异常对象 抛出一个异常。

异常的传递:​ 沿着方法调用链,反向传递

异常的处理:​
1、声明抛出,throws​
2、捕获异常 (1)try-catch 。 多个catch,先catch子类异常,再catch父类异常。printStackTrace():打印异常栈追踪信息。​
(2)try-catch-finally 。finally无论什么时候都会执行,一般用来释放资源。 ​
(3)try -finally

反编译:javap -v ***

方法覆盖:子类方法不能抛出一个父类方法没有抛出的异常​
(子类方法抛出的异常必须是父类方法抛出的异常的 同类、子类,或者什么也不抛)为了保证多态可用,所以父类抛异常的范围必须更大,针对父类做出的异常处理就必然适用子类,保证代码稳定性。


自定义异常

项目开发中还经常遇到java内置异常类不能满足实际需求的情况,此时需要用户自己定义异常类。

用户自定义异常的一般步骤如下:
1、创建一个类继承于Throwable或其子类(通常是Exception类)
2、为该类异常添加构造方法
3、在一个方法中使用throw抛出异常
4、在另一个方法中捕获并处理异常