注意:本文介绍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. Xcode部分快捷键

    编译调试: command+B 编译 command+R 编译并运行 command+shift+O 单步调试 command+shift+I 执行进入函数 command+shift+T 执行跳出函 ...

  2. c#获取数组中指定元素的索引

    //获取元素的索引 ArrayList arrList = new ArrayList(); ; i < array.Length; i++) { ) { arrList.Add(i); } } ...

  3. Markdown简单教程

    前言:大家好 我是阿飞~ 今天给大家推荐一个不错的东西 MarkDown 今后的潮流就是用它来写readme文件 具体好处多多 就把它理解为可以快速设置样式的txt文档吧~ 标题 # 每一级标题通过# ...

  4. Java设计模式 (转)

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  5. ORACLE SEQUENCE跳号总结

      在ORACLE数据库中,序列(SEQUENCE)是使用非常频繁的一个数据库对象,但是有时候会遇到序列(SEQUECNE)跳号(skip sequence numbers)的情形,那么在哪些情形下会 ...

  6. python基础学习(十三)

    re模块包含对 正则表达式.本章会对re模块主要特征和正则表达式进行介绍. 什么是正则表达式 正则表达式是可以匹配文本片段的模式.最简单的正则表达式就是普通字符串,可以匹配其自身.换包话说,正则表达式 ...

  7. python基础教程(五)

    字符串基本操作 所有标准的序列操作(索引.分片.乘法.判断成员资格.求长度.取最小值和最大值)对字符串同样适用,前面已经讲述的这些操作.但是,请注意字符串都是不可变的. 字符串的方法: 字符串从str ...

  8. python的white循环

    # _*_coding:utf-8 _*_import datetimename = 'gyf'passd = 123count =0now = datetime.datetime.now()whil ...

  9. Google推出移动网页开发者认证考试 价格99美元

    如果您是移动网页开发人员,希望了解您的编码实力,Google将推出一个认证流程,让您可以参加考试,如果您通过,可以在您的简历,网站和其他在线上显示电子徽章配置文件.           此外,潜在的雇 ...

  10. 聊一聊我们都熟知的 “ Java分层 ”

    一.为什么要分层. 以前的我们,写代码的时候,都在main()方法中,出现了错误,就慢慢调试,这样浪费了我们很长的时间,而我们程序员的时间是非常宝贵的 但是当我们使用分层架构的时候,就可以清晰明确的知 ...