异常

使用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声明抛出的方法中,即把该异常交给该方法的调用者处理。

你可能感兴趣的:(异常)