Java的异常总结

总结一下Java的异常知识 :

异常执行的流程图如下:

Java的异常总结
对上述流程图进行说明:

(1) 当程序在运行的过程中出现了异常后,那么会有JVM自动根据异常的类型实例化一个与之类型匹配的异常类对象(此处用户不关心new,由系统自动处理)。

(2)产生了异常对象后,首先会判断当前的语句上是否存在有异常处理,如果当前没有异常处理,那么就交给JVM进行默认的异常处理,(输出异常信息,而后结束程序的运行)。

(3)如果此时存在有异常的捕获操作,那么会由try语句来捕获产生的异常类实例化对象,而后与try语句后的每一个catch进行比较,如果现在有符合的捕获类型,则使用当前catch的语句来进行异常的处理;如果不匹配,则向下继续匹配catch语句。

(4)不管最后异常处理能否匹配,那么都要向后执行,如果此时程序中存在finally语句,那么我们就先执行finally中的代码,但是执行完毕后需要根据之前的catch匹配结果来决定如何执行,如果之前已经成功捕获了异常,那么我们就继续执行finally之后的代码,如果之前没有成功的捕获异常,那么我们就将此异常交给JVM进行默认处理(输出异常信息,而后结束程序执行)。

总结:整个过程就好比方法重载一样。根据catch后面参数类型进行匹配,但是所有的Java对象都存在向上转型的操作支持,也就是说如果要真的匹配类型,简单的做法就是匹配Exception就够了。

两点说明

  • 在编写多个catch捕获异常的时候,捕获范围大的异常一定要放在捕获范围大小的异常之后,否则程序编译错误。
  • 虽然直接捕获Exception较方便,但是这样也不好,因为所有的异常都会按照同样一种方式进行处理。如果在一些严格的项目里面,异常一定要分开处理较好。

throws关键字和throw关键字

  • throws关键字
    throws关键字主要用于方法声明上,指的是当方法之中出现异常后交由被调用处处理。

一个问题:主方法能否使用throws抛出异常呢?
在主方法上如果继续抛出了异常,那么这个异常就将交给JVM进行处理,也就是默认的处理方式,输出异常信息,而后结束程序调用。主方法最好不要加throws,因为程序即时出错了,也希望可以正常的结束调用。

  • throw关键字
    在程序之中可以直接使用throw手工抛出一个异常类的实例化对象。

  • throws和throw的区别?
    throw:指的是方法为人为抛出异常类对象(这个对象可能是自定义的实例化对象或者已有的异常)。
    throws:在方法的声明上使用,表示此方法在调用时必须处理异常。

Runtime关键字

在Java中为了方便用户代码的编写,专门提供了一种RuntimeException的类,这种异常类最大特征,如果在程序编译的时候不会强制性的要求用户处理异常,用户可以根据自己的需要选择性处理,但是如果没有处理又发生异常了,将交给JVM默认处理。也就是说,RuntimeException的子异常类,可以根据用户需要选择进行处理。

问题:Exception和RuntimeException的区别?、

  • Exception是RuntimeException的父类
  • Exceptions异常必须要被处理,而RuntimeException的异常可以选择性的处理。

assert关键字

assert主要功能是进行断言,在Java中的断言指的是程序执行到某行代码处一定是预期的结果。
例如:assert num == 20 : “num的值不是20;
默认情况下断言是不应该影响程序的·运行的,也就是说在java解释程序的时候,断言是默认不起作用的。

java -ea TestDemo 启用断言
在java中里面断言的功能比C++多,但是并没有多少实际意义。

补充:
如果要描述类图,一般有三个组成部分:

  • 第一层:类名称,如果是抽象类使用斜体字。
  • 第二层:描述类中的属性,对于属性肯定要封装,如果要封装,使用”-“表示:public(+)、 protected(#)、private(-)。
  • 第三层:类中的方法。