《疯狂Java讲义》10

42 阅读6分钟

1. Java的异常机制主要依赖于try、catch、finally、throw和throws五个关键字。    

2. Java的异常分为两种,Checked异常和Runtime异常,Java认为Checked异常是在编译时可以处理的异常,所以它强制Java处理所有的Checked异常,而Runtime异常无需处理.

**3 . ******使用try...catch来捕获异常:

    语法结构为如下:

图片

 

4. 如果执行try块中的代码出现了异常情况,系统会自动生成一个异常对象,该异常对象被提交给Java运行时环境,这个过程称为抛出异常。当Java运行时环境接受到这个异常时,会寻找处理该对象的Catch块,如果找到合适的catch块,就把对象交给这个catch快进行处理,这个过程称为捕获异常,当然了,如果没有找到合适的catch块,那么程序将终止。

5. 程序在执行try中的代码时,如果遇到异常,就会产生Exception,上面也提到了,会调用合适的catch来进行处理。这里要说明的是,每一个可以接收的异常都有自己相对应的catch语句,也就是有唯一性。

6. Java把所有的非正常情况分为两种,一种是异常(Exception),一种是错误(Error)。Error错误一般是指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失效等。这种错误无法恢复或不可能捕获,将导致应用程序中断,因此应用程序不应该试图使用catch块来捕获Error对象。

7. try语句与if语句的区别:

    try和catch语句后面的花括号不能省略,但是if后面如果只有一行语句,花括号是可以省略的。

8. 看一个捕获异常的栗子:****

图片

写法就是酱紫的。红框框出来的是try和catch的用法栗子,紫色的框出来的是之前我们讲过的Scanner的用法。

给大家看一下结果:

示例1:

图片

示例2:

图片

换一种输入方法:

图片

我们再试试捕获不同异常:

示例3:

图片

如果把括号内的数据换成:

图片

结果为(示例4):

图片

    上面的几种异常处理较为常见,熟悉最好。

 

9. 捕获异常时,注意先捕获小异常,再捕获大异常。就是说,范围大些的放在程序的后面,更为具体的放在前面。用上面的例子来说,就是将

图片

    红框内的内容往后放,因为这个包含的情况很多,上面的都比较具体,所以先小后大。再例如:运行时异常应该放在空指针异常的后面。

 

10. Java7提供的多异常捕获

    在Java7之前,每个catch只能捕获一种异常,但是Java7之后,一个catch块可以捕获多种异常。

先看一下示例吧:

图片

上面和之前的代码一样,结果如下:

图片

这就是多异常捕获,需要注意的两点是:

(1)书写问题:多个异常中间用“|”隔开:

图片

(2)捕获多种类型的异常时,异常变量有隐式的final修饰,因此程序变量不能对异常变量重新赋值。

举个栗子:

图片

看一下编译信息:

图片

但是如果是只捕获一种异常变量的话,就可以重新赋值:

图片

编译没有问题。

 

11. 访问异常信息

(下面乌拉乌拉一堆字可以都不看,吃栗子)

****如果程序需要在catch块中访问异常对象的相关信息,则可以通过访问catch块的后异常形参来获得。当Java运行时决定调用某个catch块来处理该异常对象时,会将异常对象赋值给catch块后的异常参数,程序就可以通过该参数获得异常的相关信息。

来~ 栗子:

 

图片

结果如下:

图片

所有的异常对象都包含了如下几个常用的方法:

**** 1)getMessage():返回该异常的详细描述字符串;

    2)printStackTrace():将该异常的跟踪栈信息输出到标准错误输出。

    3)printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定输出流;

    4)getStackTrace():返回该异常的跟踪栈信息。

 

12. 使用finally回收资源

(下面的字可以只看粗体)

**** 如果程序在try中打开了物理资源(例如数据库连接,网络连接和磁盘文件等),这些物理资源必须显示回收。之前我们讲垃圾回收机制的时候说过,系统只能自动回收一些内存中的对象所占用的内存,不能回收物理资源。所以怎么办?如果在try或者catch中进行回收处理,程序可能得不到执行,所以我们不能放在这两个地方。为了解决这个问题,异常处理机制提供了finally块,不论是否出现异常,finally都会执行。多个catch块放在try之后,finally块放在catch块之后。

来~ 栗子:

 

图片

结果如下:

图片

再来~栗子:

 

图片

在上面的try里稍作改动,如上图。结果不变。这说明什么?我们印象中的return还是比较厉害的,一般方法执行到return都会结束,但是这里并没有结束,finally还是会继续执行,这里要注意一下。但是并不是说我们对finally无可奈何了。

又来~ 栗子:

 

图片

这个语句含义是退出虚拟机,所以程序不会执行finally块,结果如下:

图片

13. 上面我们说到可以用finally块对物理资源进行回收,但是也可以看到,代码量会增加很多。Java7后,提供了一种看起来较为简单的方法,看例子:

图片

但是,说实话,我不喜欢这个写法,可能以后是得这么用,但是,,,以后再说(傲娇脸.jpg || 傲娇脸.gif)

 

14. 使用throws声明抛出异常

****使用throws声明抛出异常的思路是:当前方法不知道如何处理异常,交给上一级去处理。如果main方法不知道如何处理,也可以使用throws声明抛出异常,交给虚拟机处理。虚拟机处理的方式是打印异常的跟踪栈信息,并终止程序运行(就是我们上面举过的例子)。

    throws声明抛出异常的语法格式为:

    throws ExceptionClass1,ExceptionClass2...

用throws的话就不用try...catch了。

举个栗子:

 

图片

这个程序结果和我们之前用try...catch的结果是一样的。

 

END

 

图片