- 当抛出异常后,首先同Java中其他对象的创建一样,将使用new在堆上创建一个异常对象;然后,当前执行路径被终止,并且从当前环境中弹出对异常对象的引用。此时,异常处理机制接管程序,并开始寻找异常处理程序处理这个异常对象。
- 所有标注异常类都有两个构造器:一个是默认构造器,另一个是接受字符串作为参数,以便能把相关信息放入异常对象的构造器。
- Throwable对象是异常类型的根类。通常,对于不同类型的错误,要抛出相应的异常类型。当异常被抛出时,异常处理机制将负责搜寻参数与异常类型相匹配的第一个处理程序,然后进入catch子句执行。catch子句结束,则处理程序的查找过程结束。
- 要自己定义异常类,必须从已有的异常类继承。建立新的异常类型,最简单的方法就是让编译器为你产生默认构造器。对异常来说,最重要的部分就是类名。
- Java强制使用“异常说明”。异常说明属于方法声明的一部分,紧跟在形式参数列表之后。
- 异常说明使用关键字throws,后面接一个所有潜在异常类型的列表。
- 可以声明方法将抛出异常,实际上不抛出。编译器相信方法可能会抛出异常,并强制方法用户进行处理。好处是:先为异常占个位置,以后就可以抛出这种异常而不用修改已有代码。
- Throwable类中打印调用栈轨迹的几个方法:
- void printStackTrace():信息输出到标准错误。
- void printStackTrace(PrintStream s),void printStackTrace(PrintWriter s)允许选择要输出的流。
- printStackTrace()方法所提供的信息可以通过getStackTrace()方法直接访问。方法返回一个由栈轨迹中的元素组成的数组,其中每个元素表示栈中的一帧。元素0表示栈顶元素(Throwable被创建和抛出的地方)
- 异常链:在一个异常捕获的地方,重新抛出另一个异常,并且把原始异常的信息保存下来,这被称为异常链。现在Throwable的子类在构造器中都可以接受一个cause对象(记录着原始异常的信息)作为参数,来传递原始异常信息。在Throwable的子类中,只有Error,Exception,RuntimeException,提供了带cause的构造器。
- RuntimeException不需要再异常说明中声明,它们被称为“不受检查异常”。这种异常属于错误,将被自动捕获。由于编译器没有强制对RuntimeException进行处理,所以它很可能直达main()方法,这种情况下,在程序退出前将调用printStackTrace()方法。
- 如果把try块放在循环里,就建立了一个“程序继续执行前必须要达到”的条件。还可以加入一个static 类型的计数器或别的装置,使循环在放弃以前能尝试一定的次数。
- 由于java中有垃圾回收机制,finally无需关系内存回收问题。当把除内存之外的资源恢复到它们的初始状态时,就要用到finally子句。这种需要清理的资源包括:已经打开的文件或网络连接。
- 当涉及break和continue语句时,finally子句也会被执行。将break和continue语句和finally一起使用,java就不再需要goto语句。
- 当覆盖方法的时候,只能抛出基类的异常说明里列出的异常。
- 构造器内抛出异常,会导致一些必要的清理工作(比如关闭文件流)不能正常进行。而且finally有时并不能解决这个问题,因为finally意味着每次都会执行清理代码,但是构造器的中途抛异常可能导致finally要清理的对象都还没构建出来,最终导致问题。
- 通用的清理习惯是:在创建需要清理的对象之后,立即进入一个try-finally语句块。
- 异常匹配:抛出异常的时候,异常处理系统会按照代码的书写顺序找出“最近”的处理程序。找到匹配的处理程序之后,它就认为异常已经被处理,然后就不再继续查找。查找的时候不要求异常完全匹配,派生类的异常可以被基类异常所匹配。
- 把“被检查的异常”转换为“不检查的异常”,可以通过将“被检查的异常”包装进RuntimeException里面,并成为这个异常的cause,可以通过getCause()的方法获取到被包装的异常。
posted @
2017-06-17 12:25
kejicjk
阅读(
96)
评论()
收藏
举报