Java 异常处理
来源:互联网 发布:java带毫秒 编辑:程序博客网 时间:2024/06/06 03:44
Java将异常分为两种,Checked异常和Runtime异常,Java认为Checked异常都是可以在编译阶段被处理的异常,所以它强制程序处理所有的Checked异常;而Runtime异常则无须处理。而Java的异常机制主要解决的就是Runtime异常。
Java的异常机制主要依赖于try、catch、finally、throw和throws五个关键字,其中try关键字后紧跟一个花括号扩起来的代码块(花括号不能省略),简称try块,它里面放置可能引发异常的代码。catch后对应异常类型和一个代码块,用于表明该catch块用于处理这种类型的代码块。多个catch块后还可以跟一个finally块,finally块用于回收在try块里打开的物理资源,异常机制会保证finally块总被执行。throws关键字主要在方法签名中使用,用于声明该方法可能抛出异常;而throw用于抛出一个实际的异常,throw可以单独作为语句使用,抛出一个具体的异常对象。
异常处理机制
Java的异常处理截止可以让程序具有较好的容错性,让程序更加健壮。当程序运行出现意外情形时,系统会自动生成一个Exception对象来通知程序,从而实现将“业务功能实现代码”与“错误处理代码”分离,提供更好的可读性。当Java运行时环境收到异常对象时,会寻找能处理该异常对象的catch块,如果找到合适的catch块,则把该异常对象交给该catch快处理,这个过程被称为捕获(catch)异常;如果Java运行环境找不到捕获异常的catch块,则运行环境终止,程序也将退出。
当Java运行时环境接收到异常对象时,如何为该异常对象寻找catch块?
当Java运行时环境接收到异常对象后,会依次判断该异常对象是否是catch块后异常类或其子类的实例,如果是,Java运行时环境将调用该catch块来处理该异常;否则再次拿该异常对象和下一个catch块里的异常类进行比较。
Java提供了丰富的异常类,这些异常类之间有严格的继承关系,图10.2显示了Java常见的异常类之间的继承关系。
从图10.2中可以看出,Java把所有的非正常情况分成两种:异常(Exception)和错误(Error),它们都继承Throwable父类。
Error错误,一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,动态链接失败等,这些错误无法恢复或不可能捕获,将导致应用程序中断。通常应用程序无法处理这些错误,因此应用程序不应该试图使用catch块来捕获Error对象。
如果程序运行时出现其他一些无法预知的错误,但是可以知道该异常对象总是Exception类或其子类的实例,我们可以调用Exception对应的catch块来处理异常。PS:程序总是把对应Exception类的catch块放在最后,因为如果把Exception类对应的catch块排在其他catch块的前面,Java运行时将直接进入该catch块(因为所有的异常对象都是Exception或其子类的实例),而排在它后面的catch块将永远也不会获得执行的机会。异常捕获时,先捕获小异常,再捕获大异常。
同一个catch块中捕获多种类型的异常时,多种异常类型之间用竖线( | )隔开。
访问异常信息
如果程序需要在catch块中访问异常对象的相关信息,则可以通过访问catch块的后异常形参来获得。
所有的异常对象都包含了如下几个常用方法:
1)getMessage():返回该异常的详细描述字符串。
2)printStackTrace():将该异常的跟踪栈信息输出到标准错误输出。
3)printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定输出流
4)getStackTrace():返回该异常的跟踪栈信息。
使用finally回收资源
程序在try块里打开了一些物理资源(如数据库连接、网络连接和磁盘文件等),这些物理资源都必须在finally中显示回收。Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只能回收内存中对象所占用的内存。不管try块中的代码是否出现异常,也不管哪一个catch块被执行,甚至在try块或catch块中执行了return语句,finally块还是会被执行。完整的Java异常处理语法结果如下:
Java7的自动关闭资源的try语句
Java7增强了try语句的功能——它允许在try关键字后紧跟一对圆括号,圆括号可以声明、初始化一个或多个资源,此处的资源指的是那些必须在程序结束时显式关闭的资源(比如数据库连接、网络连接等),try语句在该语句结束时自动关闭这些资源。
使用throws声明抛出异常
使用throws声明抛出异常的思路是,当前方法不知道如何处理这种类型的异常,该异常应该由上一级调用者处理:如果main方法也不知道如何去处理这种类型的异常,也可以使用throws声明抛出异常,该异常将交给JVM处理。JVM对异常的处理方法是,打印异常的跟踪栈信息,并终止程序运行。throws声明抛出只能在方法签名中使用,throws可以声明抛出多个异常,多个异常类之间以逗号隔开。一旦使用throws语句声明抛出该异常,程序就无须使用try...catch块来捕获该异常了。
使用throw抛出异常
Java也允许程序自行抛出异常,自行抛出异常使用throw语句来完成。
建议只有对外部的,不确定和预知的运行错误才使用异常。
- 【java】java异常处理
- java异常和异常处理
- Java 异常及异常处理
- java异常与异常处理
- Java异常处理-----自定义异常
- Java异常与异常处理
- java异常及异常处理
- Java 异常与异常处理
- Java异常与异常处理
- Java异常及异常处理
- Java异常处理--自定义异常
- JAVA异常之异常处理
- Java异常处理-----自行处理
- Java异常处理-----抛出处理
- Java异常处理-----抛出处理
- java异常处理
- java 异常处理分析
- java异常处理
- struts2框架学习笔记01
- LeetCode
- 深度学习中30个关于数据的问题
- 【Java】封装httpClient
- 构造HTTP请求Header实现"伪造来源IP"
- Java 异常处理
- python中scipycluster库简介
- Pycharm5安装步骤
- SQL 远程服务器表拷贝至本机 删除时间最老的n条记录
- idea上activiti插件的安装及使用
- Day14
- MediaInfo获取视频文件时长
- matplotlib各部件详解
- java准备知识点