第十二章 通过异常处理错误

本文深入探讨了Java中异常处理的相关概念,包括异常的创建、捕获、处理及链式操作等,并提供了异常使用指南及常见问题解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

终止与恢复:

终止模型、回复模型。程序员喜欢用“终止模型”处理

创建自定义异常:

必须从已有的异常类继承

对于异常,最重要的部分是类名

printStackTrace()

从方法调用处直到异常抛出处

打印ThrowableThrowable的调用栈轨迹

异常与日志记录:

使用java.util.logging工具将输出记录到日志中

Logger.getLogger()方法创建了一个String参数相关联的Logger对象

severe()Logger写入的最简单方式

StringWriter trace = new StringWriter();

printStackTrace(new PrintWriter(trace));

logger.severe(trace.toString());

异常说明:

属于方法声明的一部分,紧跟在形式参数列表之后

要么处理这个异常,要么就在异常说明中表示此方法将产生异常

throws关键字

捕获所有异常:

  1. Throwable fillInStackTrace() 用于在Throwable对象的内部记录栈帧的当前状态,通过把当前栈的调用信息填入原来那个异常对象而建立的
  2. 显示throw 之后try块内的代码无法到达,编写会报错

栈轨迹:

StackTraceElement[]getStackTrace()

提供编程访问由printStackTrace()输出的堆栈跟踪信息。返回堆栈跟踪元素的数组,每个元素表示一个堆栈帧。数组的第零个元素(假定数据的长度为非零)表示堆栈顶部,它是序列中最后的方法调用。通常,这是创建和抛出该throwable 的地方。数组的最后元素(假定数据的长度为非零)表示堆栈底部,它是序列中第一个方法调用。

重新抛出异常:

重新抛出异常会把异常抛给上一级的异常处理程序,同一个try块的后续catch子句将被忽略

有可能在捕获异常之后抛出另一种异常

异常链:

三种基本异常类提供了带有cause参数的构造器:ErrorExceptionRuntimeException

其他类型的异常链接起来,使用initCause()方法

Java标准异常:

Error用来表示编译时和系统错误

异常的基本的概念是用名称代表发生的问题

RuntimeException:

自动被Java虚拟机抛出

如果RuntimeException没有被捕获而直达main(),那么在程序退出前将调用异常的printStackTrace()方法

使用finally进行清理:

finally子句总能被执行

当要把除内存之外的资源恢复到它们的初始状态,就要用到finally子句

return中使用finally

finally类内部,从何处返回无关紧要,finally子句总是会执行

缺憾:异常丢失

异常的限制:

  1. 当覆盖方法的时候,只能抛出在基类方法的异常说明里列出的那些异常
  2. 异常限制对构造器不起作用,派生类的构造器的异常说明必须包含基类构造器的异常说明
  3. 派生类构造器不能捕获基类构造器抛出的异常
  4. 派生类方法可以不抛出任何异常
  5. 不能基于异常说明来重载方法

构造器:

对于在构造阶段可能会抛出异常,并且要求清理的类,最安全的使用方式是使用嵌套的try子句

在创建需要清理的对象之后,立即进入一个try-finally语句块

异常匹配:

派生类的对象也可以匹配其基类的处理程序

其他可选方式:

只有在你知道如何处理的情况下才捕获异常

把异常传递给控制台:

main()传递给控制台

把“被检查的异常”转换为“不检查的异常”:

直接把“被检查的异常”包装进RuntimeException里面,还可以用getCause()捕获并处理特定异常

异常使用指南:

  1. 在恰当的级别处理问题
  2. 解决问题并重新调用产生异常的方法
  3. 进行少许修补,然后绕过异常发生的地方继续执行
  4. 用别的数据进行计算,以代替方法与记会返回的值
  5. 把当前运行环境下能做的事情尽量做完,然后把相同的异常重抛到更高层
  6. 把当前运行环境下能做的事情尽量做完,然后把不同的异常抛到更高层
  7. 终止程序
  8. 进行简化
  9. 让类库和程序更安全

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值