您的位置:首页 > 编程语言 > Java开发

再读thinking in java -- 第十二章 通过异常处理错误

2018-03-21 10:29 375 查看
异常情况就是指阻止当前方法或作用域继续执行的问题。
异常的一般顺序:1、抛出异常;2、创建异常;3、当前执行路径停止,抛出异常对象的引用;4、执行异常处理程序
标准异常类都有两个构造器:默认构造器和接收字符串的构造器
异常处理模型理论上有两种:终止模型和恢复模型。实际上都用终止模型
自定义异常类需从已有的异常类继承。对异常类而言最重要的部分是类名。
Exception继承自Throwable类。当异常类写了getMessage()方法,即覆盖了Throwable中的该方法。对异常类来说,getMessage方法类似于toString方法
异常说明使用了关键字throws,后面接一个所有潜在异常类型的列表。对产生的异常未处理,要么进行处理,要么在异常说明中表明
异常说明的这类在编译时被强制检查的异常称为被检查的异常。
若被捕获声明为Exception,则可以调用其基类Throwable继承的方法:getMessage方法和getLocalizedMessage方法来获取信息/用本地语言表示的信息。toString方法返回对Throwable的简单描述。
printStackTrace()、printStackTrace(PrintStream)、printStackTrace(java.i.o.PrintStream)返回类型都为void,将打印Throwable和Throwable的调用栈轨迹。
Throwable fillInStackTrace用于在Throwable对象的内部记录栈帧的当前状态。printStackTrace方法提供的信息可由getStackTrace方法来直接访问。该方法将返回一个由栈轨迹中的元素所构成的数组,其中每一个元素(即调用的方法)表示栈中的一帧。
重抛异常会把异常抛给上一级环境中的异常处理程序,同一个try块的后续catch子句将被忽略。
调用fillInStackTrace方法那行称为异常的新的发生地。
在捕获一个异常后抛出另一个异常,且希望把原始异常信息保存下来,这被称为异常链。现在所有Throwable的子类在构造器都能接受一个cause对象作为参数,这个cause对象用来表示原始异常,这样通过把原始异常传递给新的异常,使得即使在当前位置创建并抛出了新的异常,也能追踪到异常最初发生的地方。
Throwable子类中只有三种基本的异常提供了带cause参数的构造器:Error,Exception以及RuntimeException。
Throwable用来表示任何可作为异常被抛出的类。Throwable对象可分为两种类型:用来表示编译时和系统错误的Error和被抛出的基本类型Exception。用户方法和系统错误都有可能抛出Exception。
对null引用进行访问将自动抛出NullPointerException异常。
RunTimeException被称为“不受检查异常”。这种异常属于错误,将被系统自动捕获。
在代码中忽略RunTimeException(及其子类)类型的异常,其他类型异常的处理都是由编译器强制实施的。因为RunTimeException代表的是编程错误。
finally语句用来把除内存之外的资源恢复到他们的初始状态,即使直接在try中抛出异常未处理,finally语句依然会进行执行。遇到continue和break也一样。
用某些特殊的方式使用finally可能会造成异常丢失。
若扩展基类和实现的接口有相同的方法,但抛出的异常不同,则不能改变基类的异常接口。派生类构造器的异常说明必须包含基类构造器的异常说明。派生类构造器不能捕获基类构造器抛出的异常。基类方法没抛出异常,那么派生类不能抛出异常。派生类可以不抛出异常。与普通的继承不同,异常的继承表明接口在变小。
抛出异常的时候,异常处理系统会按代码的书写顺序找出最近的处理程序。
异常处理的一个重要原则是:只有在知道如何处理的情况下才能捕获异常。
对于简单程序,简单又能保护异常信息的方法就是将其传到控制台。
使用异常的情况:
1、在恰当级别处理异常(在知道该如何处理的情况下才捕获异常)
2、解决问题并重新调用产生异常的方法
3、进行少许修改,然后绕过异常发生的地方继续执行
4、用别的数据进行计算,以代替方法预计会返回的值
5、把当前运行环境下能做的事尽量做完,然后把相同异常抛到更高层
6、把当前运行环境下能做的事尽量做完,然后把不同异常抛到更高层
7、终止程序
8、进行简化
9、让类库和程序更完全
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: