浅析Java异常
1、什么是异常
结构不佳的代码不能运行,这是Java的基本理念。
发现错误的理想时机是在编译期。然而,编译器并不能发现所有的错误,余下的问题就需要在程序运行时解决。这就需要错误能通过某种方式,把适当的信息传递给特定的接收者处理。Java中的异常处理的目的在于通过使用少量的代码来简化大型、可靠的程序的生成,通过此方式让你的应用中没有未处理的错误,而且它还带来了一个明显的好处:降低错误处理代码的复杂度。
异常,根据字面理解,有意外之意。把它置于代码层面来理解,即阻止了当前方法或作用域继续执行。
在Java中,异常被当做对象来处理,其基类是Throwable。
2、Java中的异常类型
Java从Throwable直接派生出Exception和Error。其中Exception是可以抛出的基本类型,在Java类库、方法以及运行时故障中都可能抛出Exception型异常;Error表示编译时和系统错误。异常类的结构层次图如下:

典型的RuntimeException包括NullPointerException, IndexOutOfBoundsException, IllegalArgumentException等;非RuntimeException包括IOException, ClassNotFoundException等。
而按照编译器检查方式划分,异常又可以分为检查型异常(CheckedException)和非检查型异常(UncheckedException)。Error和RuntimeException合起来称为UncheckedException,之所以这么称呼,是因为编译器不检查方法是否处理或者抛出这两种类型的异常,因此编译期间出现这种类型的异常也不会报错,默认由虚拟机提供处理方式。除了Error和RuntimeException这两种类型的异常外,其它的异常都称为Checked异常。
3、Java如何处理异常
3.1 try-catch, try-finally, try-catch-finally
对于checked类型异常,我们要么对它进行处理,要么在方法头使用throws抛出。
public static void createFile() throws IOException{
File file = new File("C:/test.txt");
if(!file.exists()){
file.createNewFile();
}
}
public static void main(String[] args) {
try {
createFile();
} catch (IOException ex) {
// handle exception here
}
}
关于catch需要注意的几点:
1)、参数的异常类型必须是Throwable类或者其子类。
2)、从上往下的catch语句,其参数类型必须按照从子类到父类顺序,因为一旦匹配到一个类型,就会忽略往后的catch。比如IOException必须放到Exception前面,否则编译器会报错。
3)、可以有一个或者多个catch语句,甚至如果有finally语句的情况下,可以没有catch语句,如try-finally。
想要捕获多个异常,可以使用多个catch语句,JDK7以后提供了另外一种方式:多重捕获(multi-catch)。
try{
// other code
} catch (IOException | SQLException ex) {
throw ex;
}
4)、不要忽略异常。空的catch块会使异常达不到应有的目的,除非诸如关闭FileInputStream的时候,因为你还没有改变文件的状态,因此不必执行任何恢复动作,并且已经从文件中读取到所需要的信息,因此不用终止正在进行的操作。
关于finally需要注意的几点:
1)、finally中的代码总是会被执行,除非在执行try或者catch语句时虚拟机退出(System.exit(1))。
2)、finally块可以做一些资源清理工作,如关闭文件、关闭游标等操作。
3)、finally块不是必须的。
另外,如果在try和finally块中都执行了return语句,最终返回的将是finally中的return值。
3.2 异常链
常常想要在捕获一个异常后抛出另外一个异常,并且希望把原始异常信息保存下来,这就是异常链。在JDK1.4以后,Throwable子类在构造器中可以接受一个cause对象作为参数,表示原始异常,通过这样把原始异常传递给新的异常,使得即使在当前位置创建并抛出了新的异常,也能通过这个异常链追踪到异常最初发生的位置。
但在Throwable子类中,只有Error, Exception, RuntimeException三类异常类提供了带cause参数的构造器,其它类型的异常则需要通过initCause()方法。例如定义了CustomException类,可以这样使用:
CustomException cmex = new CustomException();
cmex.initCause(new NullPointerException);
throw cmex;
这样一来,CustomException继承自Exception或RuntimeException,就属于自定义异常了。
一般来说,自定义异常的作用有以下情形:
1)、将检查型异常转换为非检查型异常。
2)、在产生异常时封装上下文信息、定义异常码、收集环境对象,有利于信息的传递。
4、异常使用指南
1)、在知道该如何处理的情况下才捕获异常。
2)、自定义异常类型,用以封装所有的检查型异常。
3)、在程序的边界进行异常捕获。如服务端相应客户端的请求,在出口处catch内部有可能产生的异常,并统一throw一个封装过的异常给客户端,免得暴露服务端敏感信息。
4)、只针对异常的情况才使用异常。不要在所有的代码中习惯性地使用try-catch,因为这会影响性能。
5)、抛出与抽象相对的异常。如果方法抛出的异常与它执行的任务没有明显的联系,这种情形会使人不知所措。为了避免这个问题,更高层的实现应该捕获低层的异常,同时抛出可以按照高层抽象进行解释的异常,这种做法被称为异常转译(exception translation),如下:
try{
// use lower-level abstraction to do our bidding
} catch(LowerLevelException ex){
throw new HigherLevelException(...);
}
另外一种特殊的异常转译称为异常链,上面已作描述。如果低层的异常对于调试导致高层异常的问题非常有帮助,使用异常链就很合适。高层的异常提供访问方法(Throwable.getCause)来获得低层的异常。
6)、每个方法抛出的异常要有文档描述。利用Javadoc的@throws标记,记录抛出每个异常的条件。如果一个方法可能抛出多个异常,不要使用这些异常类的某个超类。如不要声明一个方法“throws Exception”或“throws Throwable”,这将没有任何指导信息。
参考:
浅析Java异常的更多相关文章
- 【转】Java异常总结和Spring事务处理异常机制浅析
异常的概念和Java异常体系结构 异常是程序运行过程中出现的错误.本文主要讲授的是Java语言的异常处理.Java语言的异常处理框架,是Java语言健壮性的一个重要体现. Thorwable类所有异常 ...
- Java异常总结和Spring事务处理异常机制浅析
异常的概念和Java异常体系结构 异常是程序运行过程中出现的错误.本文主要讲授的是Java语言的异常处理.Java语言的异常处理框架,是Java语言健壮性的一个重要体现. Thorwable类所有异常 ...
- 浅析java内存管理机制
内存管理是计算机编程中的一个重要问题,一般来说,内存管理主要包括内存分配和内存回收两个部分.不同的编程语言有不同的内存管理机制,本文在对比C++和Java语言内存管理机制的不同的基础上,浅析java中 ...
- 浅析 java ArrayList
浅析 java ArrayList 简介 容器是java提供的一些列的数据结构,也可以叫语法糖.容器就是用来装在其他类型数据的数据结构. ArrayList是数组列表所以他继承了数组的优缺点.同时他也 ...
- 浅析Java中的深拷贝和浅拷
浅析Java中的深拷贝和浅拷贝 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: in ...
- 浅析Java中的native关键字
浅析Java中的native关键字 native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中.Java语言本身不能对操作系统底层进 ...
- 浅谈java异常[Exception]
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...
- 基础知识《十》java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
本文转载自 java 异常捕捉 ( try catch finally ) 你真的掌握了吗? 前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理 ...
- Java异常体系及分类
上图是基本的java异常体系结构. 主要分为2大类:Error和Exception 1.Error:描述了Java运行系统中的内部错误以及资源耗尽的情形.应用程序不应该抛出这种类型的对象,一般是由虚拟 ...
随机推荐
- 《SQL Server企业级平台管理实践》读书笔记——几个系统库的备份与恢复
master数据库 master作为数据库的主要数据库,记录着SQL Server系统的所有系统级信息,例如登录用户.系统配置设置.端点和凭证以及访问其他数据服务器所需要的信息.master数据库还记 ...
- 大数据公益课堂成就你高薪之梦,30W,50W,100W...
从之前的知道“大数据”这词,到2013年正式开始了解大数据领域,再到2014年深入研究大数据相关的领域,到现在逐渐影响周围的同学.朋友和家人.大数据技术将给我们带来的远不止我们想到的这些.曾经我身边的 ...
- sql 把特定数据排在最前面
感谢www.baidu.com/p/dongfanghong_1 sql大神,简单的语法运用起来简直活了. 第一法] select * from table where name='D' UNION ...
- HttpClent4.3 的例子
package com.unbank.robotspider.util; import java.io.IOException; import java.net.MalformedURLExcepti ...
- Nginx+Lua+Redis 对请求进行限制
Nginx+Lua+Redis 对请求进行限制 一.概述 需求:所有访问/myapi/**的请求必须是POST请求,而且根据请求参数过滤不符合规则的非法请求(黑名单), 这些请求一律不转发到后端服务器 ...
- 用Qemu模拟vexpress-a9 (三)--- 实现用u-boot引导Linux内核
环境介绍 Win7 64 + Vmware 11 + ubuntu14.04 32 u-boot 版本:u-boot-2015-04 Linux kernel版本:linux-3.16.y busyb ...
- RabbitMQ - 实例操作
以前在单项目中用过RabbitMQ,没有问题 不过这次在分布式项目中使用RabbitMQ中有点搞糊涂了,但是实际上是没有问题的,思路清晰就行 简单看一下实际操作的示例吧: 资源文件中需要配置基本的ra ...
- JavaWeb学习之Servlet(二)----Servlet的生命周期、继承结构、修改Servlet模板
[声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140466.html 一.http协议回顾: 在上一篇文章中:JavaW ...
- Unity制作FPS Demo
等到把这个Unity FPS Demo[僵尸杀手]完成后再详细补充一下,使用Unity制作FPS游戏的经历,今天做个标识.
- 我的Unity学习路线
前言 上班的时间内都很忙在做项目,休息时间里闲下来了,却觉得没什么事做不自在.难道真是苦逼的命不会享受? 想了一下这一段时间以来的过程:先是重新看了一遍Unity的基础部分,然后买了<3D数学基 ...