Java中的异常体系


 对异常已经学了很久了,最近又有新的理解,再更新一下这个文章,主要给自己看。

 

1、异常体系

======================================================== 

java继承异常处理 java异常继承体系_Java

 

Throwable,是一个类,表示可抛出的,它是所有的异常都继承的类。

Throwable的子类,又分为两种,一种是Error,另一种是Exception。

Error系的类一般不是应用程序抛出的,而是Jvm抛出的,用户的Java程序不需要管,而且它是运行的时候Jvm抛出的,Java程序想管也管不了。

Exception是用户的Java程序抛出来的,又分为两种。一种是Runtime Exception,就是运行时异常。另一种是非Runtime Exception,就是除了Runtime Exception的子类外其他的类,统称为非Runtime Exception。

Runtime Exception是用户的Java程序运行过程中,Java程序自己产生的,它和上面的Error有所区别,Error是Java程序运行过程中Jvm抛出来。因为Java程序是由Jvm去执行的,所以表面上看一个Java程序运行的过程中只有JVM的进程在操作系统中可见,其实这个进程中运行的程序分为两部分,一部分是JVM自己的代码,另一部分是用户写的Java程序。那么,在运行的过程中,jvm抛出的异常就是Error的子类,用户写的java程序抛出的异常就是Runtime Exception的子类。(这里要注意区分Jvm和用户的Java程序这两个东西,不是同一个东西)这就是Error和Runtime Exception的区别。

 

2、Checked Exception和Unchecked Exception

====================================

首先,要明白Checked的含义。

Checked的含义是检查,主要指的是用户写的Java程序接受Javac这个编译器的检查。

其次,要明白Checked Exception的含义。

因为受检指的是受Javac这个编译器的检查,因此,Java程序在编译的过程,Javac编译器检查出来的异常就称为Checked Exception(受检异常)。

从这个定义可以看出来,Error肯定不是受检异常,因为它是在运行阶段由Jvm抛出来的,在编译阶段,javac是只处理用户的Java程序的,不会有Jvm的参与,因此Error肯定不是受检异常。

从这个定义还可以看出来,Runtime Exception肯定也不是受检异常,因为它是在运行阶段由Java程序抛出来的。

从这个定义和以上的分析中,可以看出来,受检异常就是所有的非Runtime Exception,也就是如下图所示的各种异常。

java继承异常处理 java异常继承体系_程序运行_02

 

3、各种异常如何对待

=================

受检异常,也即所有的非Runtime Exception,在编译阶段都会被查出来,这就要求Java程序自己必须得要catch这个异常,否则,Java程序就无法通过编译。因此,受检异常是Java程序必须要用catch块去处理的异常。

Unchecked Exception,就是除Checked Exception之外的全部Exception,包括Error和RuntimeException。他们无需Java程序自己理会,程序员不需要处理这些异常。

所以,所谓异常处理,主要是值得去处理Unchecked Exception。

 

4、如何处理异常

=============

处理异常就是try catch finally。

没有新的理解了。