一、异常处理机制

1.1、异常在java中以类和对象的形式存在。那么异常的继承结构是怎样的?

  1. 我们可以使用UML图来描述一下继承结构。<br /> UML图有很多工具,例如:Rational Rose(收费的)、starUML等....<br /> Object<br /> Object下有Throwable(可抛出的)<br /> Throwable下有两个分支:Error(不可处理,直接退出JVM)和**Exception**(可处理的)<br /> Exception下有两个分支:<br /> **Exception的直接子类**:**编译时异常**(要求程序员在编写程序阶段**必须预先**对这些异常进行**处理**,如果不处理编译器报错,因此得名编译时异常。)。<br /> **RuntimeException**:**运行时异常。**(在编写程序阶段程序员可以预先处理,也可以不管,都行。)<br />

1.2、编译时异常和运行时异常,都是发生在运行阶段。编译阶段异常是不会发生的。

  1. 编译时异常因为什么而得名?<br /> 因为编译时异常必须在编译(编写)阶段预先处理,如果不处理编译器报错,因此得名。<br /> 所有异常**都是在运行阶段**发生的。因为只有程序运行阶段才可以**new对象。**<br /> 因为异常的发生就是new异常对象。<br />

1.3、编译时异常和运行时异常的区别?

  1. 编译时异常一般发生的概率比较**高**。<br /> 举个例子:<br /> 你看到外面下雨了,倾盆大雨的。<br /> 你出门之前会预料到:如果不打伞,我可能会生病(生病是一种异常)。<br /> 而且这个异常发生的概率很高,所以我们出门之前要拿一把伞。<br /> “拿一把伞”就是对“生病异常”发生之前的一种处理方式。
  2. 对于一些发生概率较高的异常,需要在运行之前对其进行预处理。
  3. 运行时异常一般发生的概率比较**低**。<br /> 举个例子:<br /> 小明走在大街上,可能会被天上的飞机轮子砸到。<br /> 被飞机轮子砸到也算一种异常。<br /> 但是这种异常发生概率较低。<br /> 在出门之前你没必要提前对这种发生概率较低的异常进行预处理。<br /> 如果你预处理这种异常,你将活的很累。<br /> <br /> 假设你在出门之前,你把能够发生的异常都预先处理,你这个人会更加<br /> 的安全,但是你这个人活的很累。<br /> <br /> 假设java中没有对异常进行划分,没有分为:编译时异常和运行时异常,<br /> 所有的异常都需要在编写程序阶段对其进行预处理,将是怎样的效果呢?<br /> 首先,如果这样的话,程序肯定是绝对的安全的。<br /> 但是程序员编写程序太累,代码到处都是处理异常<br /> 的代码。<br />

1.4、编译时异常还有其他名字:

  1. 受检异常:CheckedException<br /> 受控异常<br />

1.5、运行时异常还有其它名字:

  1. 未受检异常:UnCheckedException<br /> 非受控异常<br />

1.6、再次强调:所有异常都是发生在运行阶段的。

1.7、Java语言中对异常的处理包括两种方式:

  1. 第一种方式:在方法声明的位置上,使用throws关键字,抛给上一级。<br /> 谁调用我,我就抛给谁。抛给上一级。
  2. 第二种方式:使用try..catch语句进行异常的捕捉。<br /> 这件事发生了,谁也不知道,因为我给抓住了。
  3. 举个例子:<br /> 我是某集团的一个销售员,因为我的失误,导致公司损失了1000元,<br /> “损失1000元”这可以看做是一个异常发生了。我有两种处理方式,<br /> 第一种方式:我把这件事告诉我的领导**【异常上抛】**<br /> 第二种方式:我自己掏腰包把这个钱补上。**【异常的捕捉】**<br /> <br /> 张三 --> 李四 ---> 王五 --> CEO<br /> <br /> 思考:<br /> 异常发生之后,如果我选择了上抛,抛给了我的调用者,调用者需要<br /> 对这个异常继续处理,那么调用者处理这个异常同样有两种处理方式。

1.8、注意:Java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了调用者JVM,JVM知道这个异常发生,只有一个结果。终止java程序的执行。

1.9、代码是否执行

image.png