《Java编程思想》笔记 第十二章 通过异常处理错误

1.异常也是对象

  •  标准异常类都有两个构造器,一个默认,一个接受字符串。
  1.  抛异常与方法返回类型不同,但有相似效果使当前方法退出并返回,抛异常可以看作是一种不同的返回机制。(异同点不必深究)
  2. Throwable类对象可被任意异常抛出,它是异常的根类。
  3.  异常对象中仅有的就是异常类型,其他内容一般没有。
  4. 一个方法内部或者内部调用其他方法抛出异常,这个方法就会在抛出异常过程中结束。
  5. 标识符id可能用不到但不能不写,catch要紧跟在try块之后,匹配到最合适的异常后进入catch之后的catch不再匹配,这与没有break就会继续匹配switch不同
try{
            
        }catch(Type1 id1){
            
        }catch(Type2 id2){
            
        }...

2.恢复模型

  • catch不抛异常用来修复错误,或把try放入while循环里这样不断的进入try直到得到满意结果。

3.自定义异常 

  • 要自定义异常必须从已有异常继承。

4.将异常记录在日志中

Logger logger  = logger.getLogger(ExceptionName)
        
        StringWriter trace = new StringWriter();
        printStackTrace(new PrintWriter(trace));
        logger.severe(trace.toString);

5.异常说明 

  • 关键词 throws  跟在方法后面,如f() throws Exception,Exception1, . . .{} 意味着这个方法f可能会抛出异常列表中的异常。  关键词throw ,抛出一个异常。

6.异常类层次结构图及其个别重要的子类

1.Throwable

    1.1 Error 

  • 错误,系统自身错误,JVM遇无法处理的错误,一般与代码无关。

    1.2 Exception

  • 与编程有关的所有异常基类。
  •         1.2.1 IOException : 输入、输出异常
  •         1.2.2 RuntimeException :运行时异常

7. 不可查的异常

  • Error和RuntimeException 又称不可查的异常(unchecked exceptions)编译器不要求强制处置的异常,可不用catch接受,其他Exception为可查的异常(checked exceptions)编译器要求必须处置的异常.

8.栈轨迹

8.1 Throwable类的2个方法获取异常信息。

  • String getMessage();获取异常详细信息(构造器内的添加的描述详细)
  • String getLocalizedMessage(); 本地语言描述的详细信息,默认和getMessage()一样。
  • toString();  直接打印异常标识符e

8.2 打印栈轨迹

  • void printStackTrace(); 输出到标准错误
  • void printStackTrace(PrintStrean);输出字节流
  • void printStackTrace(java.io.PrintWriter);输出到字符流

9. 重新抛出接受到的异常

  • throw.e ,抛给上一级,本级后续catch不会再执行。重新抛出后栈轨迹还是原来的轨迹,更新这个信息则用throw (Exception)e.fillInStackTrace(); 这里便成了异常新的发生地,就和这里throw一个新异常一样,栈轨迹从这里开始。

10.异常链

11.finally 总能执行。

  •  try--(catch可无)--finally

11.1 try finally 放在循环里可以做到“程序继续执行前必须要达到某个条件”。

11.2 使资源恢复到初始状态可以finally

11.3 try块执行停止(无catch)后在执行下一步操作之前finally会立刻执行

  • 在异常被抛到更高层前就会执行finally
  • break、continue或者带标签时finally也会先执行
  • return在finally也会先执行

11.4 可能造成原异常丢失的finally用法:

  • finally里产生另一个异常   
  • finally里return。一般这种异常是运行时异常。

12.异常的限制

  • 覆盖方法时只能抛出基类方法的异常列表中的一种或者多种异常或者其子类异常或者不抛,但不能抛出基类没有的异常。

13.构造器异常

13.1 构造器抛了异常则创建对象后也要抛出异常,并且与构造器的完全一致。

13.2 父类构造器抛了异常,子类构造器必须抛出基类所有的异常,不可以不抛,并且可以抛出其他异常。

14.异常匹配

  • 基类异常会匹配子类异常,且只匹配第一个能匹配的catch,所以在多个catch中基类和子类异常都要匹配时,子类异常catch要出现在父类catch之前,如果出现在父类之后会被父类捕获匹配子类catch永远也不会被匹配,所以会报错。

15.异常原则

  • 异常处理一个原则就是:只有知道了如何处理异常才去捕获这个异常,否则就可能发生吞食,既异常发了却不知道。
原文地址:https://www.cnblogs.com/mibloom/p/9040404.html