博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中的异常处理
阅读量:6943 次
发布时间:2019-06-27

本文共 2677 字,大约阅读时间需要 8 分钟。

一、异常概述

开发者都希望所有错误都能在编译阶段被发现,就是试图在运行程序之前排除所有错误,但这是不现实的,余下问题必须在运行期间得到解决。Java将异常分为两种:CheckedException和RuntimeException。其中,CheckedException都是可以在编译期间被处理的异常,而RuntimeException异常则无需处理。增加了异常处理机制后的程序有更好的容错性,更健壮。

二、异常处理机制

Java异常处理机制可以让程序有更好的容错性,让程序更健壮。异常处理机制可以实现将“业务功能实现代码”和“错误处理代码”分离,提供更好的可读性。

1.使用try...catch...捕获异常
把系统业务实现代码放在try块中定义,所有异常处理逻辑放入catch块中进行处理。下面是Java异常处理机制的语法结构:

clipboard.png

如果执行try块里的业务逻辑代码出现异常,系统自动生成一个异常对象,该异常对象被提交给Java运行时环境,这个过程被称为抛出异常。

当Java运行时环境收到异常对象时,会自动寻找能处理该异常对象的catch块,如果找到合适的catch块,则把该异常对象交给该catch块处理,这个过程被称为捕获异常。

提示:1.如果程序没有为这段代码定义任何的catch块,则Java运行环境无法找到处理该异常的catch块,程序就在此退出。

2.try块中声明的变量是代码块内局部变量,它只在try块中有效,在catch块中不能访问该变量。

2.异常类的继承体系

图片描述

Java把所有非正常情况分为:异常(Exception)和错误(Error)他们都继承Throwable父类。Error错误:一般是指与虚拟机相关的错误,如系统崩溃、虚拟机错误、动态链接失败等。这种错误无法恢复和不可能捕获,将导致应用程序中断。进行异常捕获时,应遵循先处理小异常,再处理大异常。

3.Java7提供的多异常捕获

从Java7开始,一个catch块可以捕获多种类型异常。应注意以下2个地方:1)捕获多个类型的异常时,多种异常类型应用竖线(|)隔开。2)捕获多个类型的异常时,异常变量有隐式的final修饰,因此程序不能对异常变量重新赋值。

4.使用finally回收资源

有时候,程序在try块中打开了一些物理资源(例如数据库连接等), 这些都必须显式回收。为了保证一定能回收try块中打开的物理资源,异常处理机制提供了finally语句块。不论try块中代码是否出现异常,也不管哪一个catch块被执行,甚至try块或catch块中执行了return语句,finally块总会被执行。但如果在try块或catch块中使用System.exit(1)语句退出虚拟机,则finally块将失去执行机会。完整的Java异常处理语法结构如下:

clipboard.png

通常情况下,不要在finally块中使用如 return或throw等导致方法终止的语句,一旦在finally块中使用此类语句,将导致try块、catch块中的return或throw语句失效。

5.自动关闭资源的try语句
允许在try块关键字后紧跟一对圆括号,圆括号可以声明、初始化一个或多个资源,此处的资指的是那些必须在程序结束时显示关闭资源(如数据库连接,网络连接等),try语句块在该语句块结束时自动关闭这些资源。
为保证try语句块可以正常关闭资源,这些方法必须实现AutoCloseable或Closeable接口,实现这两种接口就必须实现close()方法。

三、CheckedException和RuntimeException体系

Java将异常分为两种:CheckedException和RuntimeException。

对于CheckedException的处理方式有两种:
1)当前方法知道如何处理该异常,程序使用try...catch...块来捕获该异常,然后在其对应的catch块中处理该异常。
2)当前方法不知道如何处理这种异常,应该在定义方法时声明抛出该异常。

1.使用throws声明抛出异常

使用throws声明抛出异常的思路是:当前方法不知道该如何处理此异常,该异常应该由上一级调用者;如果main()方法也不知道该如何处理此异常,也可用throws声明抛出异常,该异常将交给JVM处理。JVM对异常的处理方法是:打印异常的跟踪栈信息,并终止程序运行。这也就是程序遇到异常后自动结束的原因。
throws声明只能用在方法签名中,throws可声明抛出多个异常类,多个异常类之间用逗号(,)隔开。throws声明语法格式如下:

throws Exception1,Exception2...

一旦使用throws声明抛出该异常,就无需使用try...catch语句块来捕获该异常。

使用throws声明抛出异常时,有一个限制:子类方法声明抛出的异常类型应该是父类方法声明抛出的异常的子类或者相同,子类方法声明抛出的异常不允许比父类方法声明抛出的异常多。

2.使用throw抛出异常

如果需要在程序中自行抛出异常,则应使用throw语句,throw语句可单独使用,throw语句抛出的不是异常类,而是一个异常实例,且每次只能抛出一个异常实例。throw语句语法格式如下:
throw ExceptionInstance;

3.自定义异常

用户自定义异常都应该继承Exception基类,如果希望自定义Runtim异常,则应继承RuntimeException基类。自定义异常格式如下:

clipboard.png

4.异常链

程序捕获原始异常,然后抛出一个新的业务异常,新的业务异常中包含了对用户的提示信息,这种处理方式称为异常转译。

clipboard.png

这种把原始信息隐藏起来,仅向上提供必要的异常提示信息的处理方式,可以保证底层异常不会扩散到表现层,可以避免向上暴露太多的实现细节,符合面向对象的封装原则。

这种把捕获一个异常然后紧接着抛出另一个异常,并把原始异常信息保存下来的方式是一种典型的链式处理,也被称为异常链。

clipboard.png

四、Java的异常跟踪栈

异常对象的printStackTrace()方法用于打印异常的跟踪栈信息,根据printStackTrace()方法的输出结果,可以找到异常的源头,并跟踪到异常的一路触发过程。应尽量对异常进行适当的处理,而不是简单的将异常跟踪栈信息打印出来。

clipboard.png

五、异常处理规则

1.不要过度使用异常

2.不要使用过于庞大的try块
3.避免使用catchAll语句
4.不要忽略捕获到的异常

转载地址:http://jranl.baihongyu.com/

你可能感兴趣的文章
Delphi获取MAC地址方法
查看>>
对Excel进行瘦身的两个方法
查看>>
oralce 行列转换(本文转载自网络)
查看>>
2015.3.13第三次课程
查看>>
初试Hbase
查看>>
android 调用webservice 报错
查看>>
使用webbench对网站进行压力测试
查看>>
解释型语言和编译型语言区别
查看>>
如何在交换机上配置DHCP中继
查看>>
VMware vsphere6.0u1升级步骤和VSAN磁盘格式升级实操,及相关问题总结
查看>>
第四章简介
查看>>
LNMP(linux+nginx+mysql+php)服务器环境配置
查看>>
Linux下redis服务的安装
查看>>
oracle设定菜单全路径
查看>>
使用Qt开发文本编辑器(一):功能介绍
查看>>
一款增加导航选项的控件
查看>>
我的友情链接
查看>>
shape用法知多少
查看>>
oracle power 函数
查看>>
网页头部<meta name="Robots" 用法 <meta>系列用法
查看>>