使用try...catch捕获异常
•执行try块里的业务逻辑代码时出现异常,系统自动生成一个异常对象,该异常对象被提交给Java运行时环境,这个过程被称为抛出(throw)异常。
•Java运行时环境收到异常对象时,会寻找能处理该异常对象的catch块,如果找到合适的catch块并把该异常对象交给该catch块处理,那这个过程被称为捕获(catch)异常;如果Java运行时环境找不到捕获异常的catch块,则运行时环境终止,Java程序也将退出。
访问异常信息
•如果程序需要在catch块中访问异常对象的相关信息,可以通过调用catch后异常形参的方法来获得。当Java运行时决定调用某个catch块来处理该异常对象时,会将该异常对象赋给catch块后的异常参数,程序就可以通过该参数来获得该异常的相关信息。
•所有异常对象都包含了如下几个常用方法:
–getMessage():返回该异常的详细描述字符串。
–printStackTrace():将该异常的跟踪栈信息输出到标准错误输出。
–printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定输出流。
–getStackTrace():返回该异常的跟踪栈信息。
try
{
需要检测的代码;
}
catch(异常类 变量)
{
异常处理代码;
}
finally
{
一定会执行的代码;
}
Finally代码块只有一种情况不会被执行。就是在之前执行了System.exit(0)。
•在Java7以前,每个catch块只能捕捉一个异常。从Java 7开始,一个catch块可以捕捉多个异常。
–catch(异常1 | 异常 2 | 异常3 ex)
–{
–}
•多个异常之间用竖线隔开。
•多异常捕捉时,异常变量之前有隐式final修饰。
–try(
– //此处声明的资源, 系统可以自动关闭它。
–)
–{
– //
–}
•对于Java7自动关闭资源的try语句,可以没有catch和finally——try块可以孤独地存在。
•自动关闭资源的try语句,有两个注意点:
–只有放在try后面的圆括号里的资源才会被关闭。
–能被自动关闭的资源必须实现Closeable或AutoCloseable接口。
•程序在try块里打开了一些物理资源(例如数据库连接、网络连接和磁盘文件等),这些物理资源都必须显式回收。
为了保证一定能回收try块中打开的物理资源,异常处理机制提供了finally块。不管try块中的代码是否出现异常,也不管哪一个catch块被执行,finally块总会被执行
Checked异常与Runtime异常
•Java的异常被分为两大类:Checked异常和Runtime异常(运行时异常)。所有RuntimeException类及其子类的实例被称为Runtime异常;不是RuntimeException类及其子类的异常实例则被称为Checked异常。
Checked异常处理:当前方法明确知道如何处理该异常,程序应该使用try...catch块来捕获该异常,然后在对应的catch块中修改该异常。•当前方法不知道如何处理这种异常,应该在定义该方法时声明抛出该异常。
•Runtime异常则更加灵活,Runtime异常无需显式声明抛出。•如果程序需要捕捉Runtime异常,也可以使用try...catch块来捕捉Runtime异常。
使用throws声明抛出异常
•throws声明抛出异常的思路是:当前方法不知道应该如何这种类型的异常,该异常应该由上一级调用者处理,如果main方法也不知道应该如何处理这种类型的异常,也可以使用throws声明抛出异常,该异常将交给JVM处理。JVM对异常的处理方法是:打印异常跟踪栈信息,并中止程序运行,这就是前面程序在遇到异常后自动结束的原因。
•throws声明抛出只能在方法签名中使用,throws可以声明抛出多个异常类,多个异常类之间以逗号隔开。throws声明抛出的语法格式如下
–throws ExceptionClass1 ,ExceptionClass2...
•如果需要在程序中自行抛出异常,应使用throw语句,throw语句可以单独使用,throw语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例。throw语句的语法格式如下:
–throw ExceptionInstance;
•如果throw语句抛出的异常是Checked异常,则该throw语句要么处于try块里,显式捕获该异常,要么放在一个带throws声明抛出的方法中,即把该异常交给该方法的调用者处理。