注意:本文介绍Java中的异常处理理论知识及相关语法结构,对于实际应用来说是万万不够的。关于如何高效地使用异常,请查看Java-高效地使用Exception-实践。

异常处理的思想是,当应用程序处于异常时,它可以声明这种异常;然后这种异常将被捕获到并得到妥善地处理,从而避免出现严重后果。所谓异常,是值与程序的正常运行逻辑相违背的非正常事件,比如,读取文件内容时,文件不存在;或者说对数组进行操作时,数组下标越界等等。而用户登录时口令验证失败这种情况不能算作异常,因为它是验证程程序正常运行逻辑的一部分。

一、异常层次结构与分类

Java中的异常层次结构如下图所示:

Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。对于这种错误应用程序是无能为力的,因此应用程序不应该抛出这种类型的对象。

Exception层次结构分解为两个分支:一支派生于RuntimeException,它表示由程序错误导致的异常。比如空指针、数组越界、错误的类型转换等等。

另一个分支表示程序本身没有问题,出问题的是IO读写等外部操作,比如在文件尾部读取数据、打开了错误的URL等等。

Java语言规范将派生干Error类或RuntimeException类的所有异常称为未检查(unchecked) 异常,所有其他的异常称为已检查(checked)异常。编译器将核査是否为所有的已检査异常提供了异常处理器。

二、声明已检查异常

根据异常规范,方法应该在首部声明所有可能抛出的异常。然而未检査异常要么不可控制(Error), 要么就应该避免发生(RuntimeException)。因此,规定方法必须对所有可能抛出的已检查异常进行声明,否则无法通过编译。

那么,我们如何知道一个方法究竟存在哪些已检查异常呢?不用担心,编译器能够对我们进行提示。当方法调用了可能抛出异常的方法时,eclipse将自动告警,如下图:

 

如果不按照提示进行修改则程序无法通过编译。

三、抛出异常

假设应用程序现在遇到了一个错误,需要抛出异常进行告警。那么,首先要确定异常的类型。Java已经事先定义好了许多Exception,常见的有IOException/SQLException等等,更多类型可以通过查阅API来确定。当然,我们也可以继承Exception然后创建自己的异常。接下来,创建异常实例,并使用throw关键字抛出异常。最后,在方法签名中声明抛出的异常类型。示例代码如下:

public void read(File file) throws Exception{
if(!file.exists()){
Exception e = new FileNotFoundException();
throw e;
}
}

四、捕获异常

异常的捕获、处理格式为:

public void callRead(){
try {
//可能抛出异常的代码
read(new File("filename1"));
read(new File("filename2"));
} catch (Exception e) {
//异常处理代码
e.printStackTrace();
}
finally{
//无论如何需要执行的代码,比如释放资源
}
}

其中,try{}catch{}是必须的,finally是可选的。可能抛出异常的代码必须放在try{}中,否则异常无法被捕获;当捕获异常时,直接跳转到catch{}进行异常处理。比如说,读取filename1时捕获了异常,那么read(new File("filename2"));这局代码将被跳过不再执行。

通常可能发生的异常不止一种,不建议都使用Exception对象进行捕获,因为它太通用,不能反映异常的具体类型。正确的做法是对不同的异常分别处理,即叠加多个catch块。

程序中总有一些工作比如释放资源,无论发生异常与否都需要去做,那么可以放在finally{}中,它在catch{}完成后一定会执行。即使前面有return语句,也将在finally{}结束后才返回。

五、再次抛出异常与异常链

考虑这种情景:应用程序调用了server模块。模块内部可能会抛出加载资源出错、访问数据库出错等多种异常。对于应用程序来说,它只关心server模块是否发生异常,而不关系异常的细节。然而异常细节又不能丢失,它应该保存并由相应的人员去识别和处理。因此,捕获到底层异常时,我们需要根据它构造出一个更高级的异常并抛出,示例代码如下:

public void convertExceptionTypeDemo() throws ServerException{
try {
//access the database
} catch (SQLException e) {
//异常处理代码
throw new ServerException("database error" + e.getMessage());
}
}

然而,Java中有更好的处理方法,就是将原始异常设置为新异常的诱饵,示例如下:

public void chainedExceptionDemo() throws Throwable{
try {
//access the database
} catch (SQLException e) {
//异常处理代码
Throwable serverException = new ServerException("database error");
serverException.initCause(e);
throw serverException;
}
}

捕获到异常时,使用下列语句就能提出原始异常:

Throwable exception = serverException.getCause();

Java-错误处理机制学习(一)异常处理的更多相关文章

  1. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

  2. java垃圾回收机制学习总结

    最近学习了一下java垃圾回收机制,将其主要内容大致总结一下: 1.什么是垃圾回收机制 java GC机制(garbage collection,垃圾收集,垃圾回收),是java特有的机制,作为jav ...

  3. Java 垃圾回收机制学习

    原文链接: http://blog.csdn.net/zsuguangh/article/details/6429592 自己学习总结: 1c++和java的内存使用的区别: 在C++中,对象所占的内 ...

  4. 简明 Java 错误处理机制

    用个最简单的例子来展示为什么需要错误处理,以及怎么用. import java.io.FileInputStream; import java.io.FileNotFoundException; pu ...

  5. Java:反射机制学习笔记

    目录 一.反射机制 1.概述 2.优缺点 3.类加载的过程 二.获取Class对象的三种方式 1.Class.forName("全类名") 2.类名.class 3.对象.getC ...

  6. Java异常控制机制和异常处理原则【转】

    原文:https://www.jianshu.com/p/15872cba211d Java异常控制机制又被称为“违例控制机制”. 捕获程序错误最理想的时机是在编译阶段,这样可以彻底避免错误的代码运行 ...

  7. Java反射机制——学习总结

    前几天上REST课,因为涉及到Java的反射机制,之前看过一直没有用过,有些遗忘了,周末找了些资料来重新学习,现在总结一下,加深印象. 什么是反射机制? 参考百度百科对java反射机制的定义: “JA ...

  8. Java学习_异常处理

    Java的异常 计算机程序运行的过程中,总是会出现各种各样的错误.有一些错误是用户造成的,比如,希望用户输入一个int类型的年龄,但是用户的输入是abc.程序想要读写某个文件的内容,但是用户已经把它删 ...

  9. JAVA反射机制—学习总结

    最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象.什么是反射机制 ...

  10. Java学习系列(一)Java的运行机制、JDK的安装配置及常用命令详解

    俗话说:“十五的月亮十六圆”.那学习是不是也是如此呢?如果把月亮看成是我们的愿望,那十五便是我们所处的“高原期”,坚持迈过这个坎,我相信你的愿望终究会现实的.记得马云曾说:今天很残酷,明天更残酷,后天 ...

随机推荐

  1. 王佩丰第一讲 认识excel笔记

    改变工作表表浅颜色 批量插入工作表 选择多张工作表然后插入 找到表格边界区域快捷键(找到表格的最后一行):快速到达最上下左右端 点击边框上下左右双击 从指定的位置开始冻结窗格 输入今天的日期 快捷键c ...

  2. 完美结合 Redux 与 React-router (react-router不切换页面)

    本文可以解答以下问题: 链接 redux 后 react-router 不切换页面 react-router 路由改变页面却不改变 redux 与 react-router 结合使用的方案 简单的问题 ...

  3. Linux工具参考篇(网摘)

    Linux工具参考篇 原文出处:[Linux Tools Quick Tutorial] 1. gdb 调试利器 2. ldd 查看程序依赖库 3. lsof 一切皆文件 4. ps 进程查看器 5. ...

  4. 解决若要安装 Microsoft Office 2010,需要MSXML 版本 6.10.1129的问题

    单击 开始单击 运行键入 注册表编辑器然后单击 确定. 找到HKEY_CLASSES_ROOT\TypeLib\{F5078F18-C551-11D3-89B9-0000F81FE221}\6.0\0 ...

  5. DRAM(MT48LC8M32B2)学习

    Micron公司,型号为MT48LC8M32B2的DRAM,其86PIN的 TSOP封装引脚定义 Micron公司,型号为MT48LC8M32B2的DRAM,其86PIN的 TSOP封装引脚定义如上图 ...

  6. [2015-11-23]分享一个批处理脚本,创建iis站点及程序池

    建站批处理 batch_createSites.bat @echo off rem 以管理员身份执行本脚本,可添加多条call 以建立多个站点 call path\to\createSites.bat ...

  7. [2014-09-21]如何在 Asp.net Mvc 开发过程中更好的使用Enum

    场景描述 在web开发过程中,有时候需要根据Enum类型生成下拉菜单: 有时候在输出枚举类型的时候,又希望输出对应的更具描述性的字符串. 喜欢直接用中文的请无视本文 不多说,直接看代码. 以下代码借鉴 ...

  8. 改变input光标颜色与输入字体颜色不同

    设置input css: color #ffd600text-shadow 0px 0px 0px #bababa -webkit-text-fill-color initial input, tex ...

  9. Linux的netstat查看端口是否开放见解(0.0.0.0与127.0.0.1的区别)

    linux运维都需要对端口开放查看  netstat 就是对端口信息的查看 # netstat -nltp p 查看端口挂的程序 [root@iz2ze5is23zeo1ipvn65aiz ~]# n ...

  10. Java异常的性能分析

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt276 在Java中抛异常的性能是非常差的.通常来说,抛一个异常大概会消耗10 ...