学习路线
异常概述
这种在运行时出现的意外错误称为“异常”
异常类
Java中的异常类可以分为两种:
错误(Error):一般指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败等,这些错误无法恢复或捕获,将导致应用程序中断;
异常(Exception):因程序编码错误或外在因素导致的问题,这些问题能够被系统捕获并进行处理,从而避免应用程序非正常中断,例如:除以0、对负数开平方根、空指针访问等。
Exception异常从编程角度又可以分为以下两种类型:
非检查型异常:编译器不要求强制处置的异常,该异常是因编码或设计不当导致的,这种异常可以避免,RuntimeException及其所有子类都属于非检查型异常
检查型异常:编译器要求及其子类(RuntimeException及其子类除外)都属于检查型异常必须处理的异常,该异常是程序运行时因外界因素而导致的,Exception
检查型异常体现了Java语言的严谨性,程序员必须对该类型的异常进行处理,
否则程序编译不通过,无法运行。
RuntimeException及其子类都是Exception的子类,
Exception是所有能够处理的异常的父类。
Java提供的异常处理机制有两种:
使用try…catch捕获异常:将可能产生异常的代码放在try语句中进行隔离,如果遇到异常,程序会停止执行try块的代码,跳到catch块中进行处理。
使用throws声明抛出异常:当前方法不知道如何处理所出现的异常,该异常应由上一级调用者进行处理,可在定义该方法时使用throws声明抛出异常。
Java中捕获异常并处理的语句有以下几种:
- try…catch语句
- try…catch…finally语句
- 自动关闭资源的try语句
- 嵌套的try…catch语句
- 多异常捕获
try…catch语句
示例
所有异常对象都包含以下几个常用方法用于访问异常信息:
- getMessage()方法:返回该异常的详细描述字符串;
- printStackTrace()方法:将该异常的跟踪栈信息输出到标准错误输出;
- printStackTrace(PrintStream s)方法:将该异常的跟踪栈信息输出到指定输出流;
- getStackTrace()方法:返回该异常的跟踪栈信息。
try…catch…finally语句
在Java异常处理机制中,提供了finally块,可以将回收代码放入此块中,
不管try块中的代码是否出现异常,也不管哪一个catch块被执行,甚至在try块或catch块中执行了return语句,
finally块都会被执行
Java垃圾回收机制不会回收任何物理资源,垃圾回收机制只能回收堆内存中对象所占用的内存。在Java程序中,通常使用finally回收物理资源
1、try块是必需的,catch块和finally块是可选的,但catch块和finally块二者至少出现其一,也可以同时出现,即有两种形式的用法:
2、try…finally和try…catch…finally;
3、try…catch…finally是语句的顺序不能颠倒,所有的catch块必须位于try块之后,finally块必须位于所有的catch块之后。
示例
在程序的catch块中①处有一条return语句,该语句强制方法返回。通常程序执行到return语句时会立即结束当前方法,但现在会在返回之前先执行finally块中的代码。 zkl.txt (系统找不到指定的文件。)
执行finally块里的资源回收!
将①处的return语句注释掉,取消②处的代码注释,使用System.exit(0)语句退出整个应用程序。因应用程序不再执行,finally块中的代码不执行
自动关闭资源的try语句
从Java 7开始,增强了try语句的功能,允许在try关键字后紧跟一对小括号,在小括号中可以声明、初始化一个或多个资源,当try语句执行结束时会自动关闭这些资源
示例
上述代码try关键字后紧跟一对小括号,在小括号中声明并初始化一个文件输入流,try语句会自动关闭该资源,这种写法既简洁又安全。
只有JDK版本是7.0或以上,才能使用自动关闭资源的try语句
嵌套的try…catch语句
使用嵌套的try…catch语句时,如果执行内部的try块没有遇到匹配的catch块,则将检查外部的catch块。
多异常捕获
从Java 7开始,一个catch块可以捕获多种类型的异常
- 捕获多种类型的异常时,多种异常类型之间使用竖杠“|”进行间隔;
- 多异常捕获时,异常变量默认是常量,因此程序不能对该异常变量重新赋值。
抛出异常
Java中抛出异常可以使用throw或throws关键字:
- 使用throw抛出一个异常对象:当程序出现异常时,系统会自动抛出异常,除此之外,Java也允许程序使用代码自行抛出异常,自行抛出异常使用throw语句完成;
- 使用throws声明抛出一个异常序列:throws只能在定义方法时使用。当定义的方法不知道如何处理所出现的异常,而该异常应由上一级调用者进行处理,可在定义该方法时使用throws声明抛出异常。
抛出异常序列
自定义异常
自定义异常类都继承Exception或RuntimeException类