Java编程思想之通过异常处理错误

1.     异常分为被检查的异常和运行时异常,被检查的异常在编译时被强制要求检查。异常被用来错误报告和错误恢复,但很大一部分都是用作错误报告的。

2.     异常情形是由于当前环境下无法得到必要的信息导致当前方法或作用域无法继续执行。当抛出异常时,首先在堆上创建了异常对象,其次当前的执行路径中止并在当前环境中弹出对异常对象的引用,此时异常处理机制接管程序,并开始寻找一个恰当的地方来继续执行程序。

3.     异常最重要的方面之一是如果发生了问题,将不允许程序沿着其正常路径继续走下去。

4.     所有标准异常类有两个构造器,一个是默认构造器,一个是接受相关信息字符串在为参数的构造器。异常类型的根类是Throwable类,错误信息可以保存在异常对象的内部或用异常类的名称来暗示。

5.     异常处理程序紧跟在try块之后,以关键字catch表示。每个catch字句是只接受一个特殊类型的参数的方法。异常处理理论有两种模型:终止模型和恢复模型。

6.     自定义异常来表示程序中可能碰到的特定问题,通过继承已有的异常类。System.err是标准错误流,不会重定向,而System.out可能会重定向。异常类调用了了在Throwable类声明的printStackTrace()方法,将打印“从异常抛出处到方法调用处”的方法调用序列。

7.     Java.util.logging工具将输出记录到日志中去。显示日志的方法是调用与日志记录消息级别相关的方法severe()。记录其他人编写的异常并生成日志的方法不同点:e.printStackTrace();

8.     异常说明数据方法声明的一部分,紧跟在形参之后。其使用了throws复数关键字,后面接一个异常类型构成的列表。代码必须与异常说明一致。如果代码产生了异常,要么处理这个异常,要么在异常说明中表明此方法将产生异常。

9.     可以声明方法将抛出异常,实际上却不抛出。这样就为异常先占了位子,以后就可以抛出这种异常而不用修改已有的代码,主要用在定义抽象基类和接口时。

10.  使用基类Exception可以捕获所有异常。

11.  把刚捕获的异常重新抛出,异常对象的所有信息都得以保持。也可以捕获异常后抛出另外一种异常。

12.  异常链:捕获异常后抛出另外一种异常,并保存原始异常的信息。三种基本的异常类带有带cause参数(表示原始异常)的构造器,是Error,Exception和RuntimeException。两种方式:1. 带cause参数(表示原始异常)的构造器,2.没有此构造器的异常类型,通过initCause()方法来把异常链接起来。

13.  属于运行时异常的类型有很多,它们自动被Java虚拟机抛出,所以不必在异常说明中列出来,称为不受检查的异常,代表编程错误,将被自动捕获。但尽管通常不用捕获RuntimeException异常,但还是可以在代码中抛出RuntimeException类型的异常。如果RuntimeException类型的异常没有被捕获而直达main(),那么在程序退出前将调用异常的printStackTrace()方法。

14.  当要把除内存之外的资源恢复到它们的初始状态时,就要用到finally子句。异常没被当前处理程序捕获,但会运行finally字句。甚至在异常没有被当前的异常处理程序捕获的情况下,异常处理机制也会在跳到更高一层的异常处理程序之前,执行finally子句。当涉及continue和break语句时,也会执行finally子句。当涉及return时,先执行finally子句,再执行return。

15.  异常忽略丢失:try块中抛出的异常被finally子句抛出的异常所取代,被catch语句捕获到。如果直接在try-finally语句的finally字句中执行return,try块抛出的异常也会被忽略。

16.  当覆盖方法时,只能抛出在基类方法的异常说明里列出的那些异常(及子类)。但是异常限制对构造器不起作用,子类的构造器可以不必理会基类构造器所抛出的异常。子类的构造器的异常声明必须包含基类构造器的异常声明。派生类的构造器不能捕获基类构造器抛出的异常。强制派生类遵守基类方法的异常声明。派生类可以不抛出任何异常,即使它是基类所定义的异常。因为异常说明本身不属于方法类型的一部分,因此不能基于异常说明来重载方法。一个出现在基类方法的异常说明的异常,不一定会出现在派生类方法的异常说明里。

17.  如果在构造器内抛出了异常,清理方法也许不能正常工作。对于创建对象的语句置于外部的try块中,如果构造失败,将进入外部的catch字句。如果构造成功,则确定对象能被清理,因此在构造之后,进入内部的try-catch-finally或try -finally块,finally字句执行清理工作。基本原则是:在创建需要清理的对象之后,立刻进入try -finally块。对于一群不能失败的构造器的对象来说,从构造和清理出发,可以群组在一起。当对于那些具有可以失败的构造器对象来说,得嵌套。

18.  异常匹配:抛出异常时,异常处理系统会按照代码的书写顺序找到最近的处理程序,找到后,就默认异常会被处理,即使异常没有被捕获,然后就不会在继续查找了。

19.  被检查的异常强制你在没有准备好处理错误时候被迫加入catch字句,导致吞下异常。解决方法:1. 通过给main方法throwsException来把异常传递给控制台。2. 可以把被检查的异常包装在RuntimeException里面,再throw出来,保证了既不需要写try-catch块,因为没有抛出被检查的异常,也包装了不会丢失任何原始异常的信息。但是如果准备捕获异常的时候,还是可以用try块来捕获你想要的异常。

20.  与恢复功能相比,报告功能才是异常的精髓所在。Java坚定强调将所有的错误都以异常的形式报告这一事实。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Janti

Java基础巩固——异常

  在Java程序运行时,常常会出现一些非正常的现象,这种情况称为运行错误。根据其性质可以分为错误和异常。

8710
来自专栏IT可乐

Redis详解(五)------ redis的五大数据类型实现原理

  前面两篇博客,第一篇介绍了五大数据类型的基本用法,第二篇介绍了Redis底层的六种数据结构。在Redis中,并没有直接使用这些数据结构来实现键值对数据库,而...

17800
来自专栏康怀帅的专栏

PHP 数据类型

PHP 支持三大类 8 种数据类型。 官方文档:http://php.net/manual/zh/language.types.php 标量(4) 布尔 boo...

31440
来自专栏司想君

详解Object.create(null)

21240
来自专栏JavaEdge

(六)-class文件结构1 什么是JVM的“无关性”?2 纵观Class文件结构

31280
来自专栏琦小虾的Binary

map 学习(上)——C++中 map 的使用

map 学习(上)——C++中 map 的使用 欠下数据结构的债,迟早是要还的…… 最近写毕业论文过程中,需要用到哈希表的数据结构,此外空闲时间在刷 Leetc...

47560
来自专栏DannyHoo的专栏

Copy mutableCopy 深拷贝、浅拷贝

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

14130
来自专栏debugeeker的专栏

《coredump问题原理探究》Linux x86版5.5节C风格数据结构内存布局之基本数据类型构成的结构体

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

16610
来自专栏增长技术

Swift体验2

使用if和switch做条件判断,使用for-in,for,while,do-while做循环 操作。括号中的条件或循环变量是可选的。括号的身体是必需的。

13430
来自专栏xingoo, 一个梦想做发明家的程序员

剑指OFFER之用两个栈实现队列(九度OJ1512)

题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 输入: 每个输入文件包含一个测试样例。 对于每个测试样例,第一...

21560

扫码关注云+社区

领取腾讯云代金券