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

     2022-03-15     698

关键词:

    Java的基本理念是 "结构不佳的代码不能运行"

    发现错误的理想时机是在编译阶段,也就是在你试图运行程序之前。然而,编译期间并不能找出所有的错误,余下的问题必须在运行期间解决。这就需要错误源能通过某种方式,把适当的信息传递给某个接收者----该接收者将知道如何正确处理这个问题。

    异常情形是指阻止当前方法或作用域继续执行的问题。

    当抛出异常后,有几件事会随之发生。首先,同Java中其它对象的创建一样,将使用new在堆上创建异常对象。然后,当前的执行路径被终止,并且从当前环境中弹出对异常对象的引用。此时,异常处理机制接管程序,并开始寻找一个恰当的地方来继续执行程序。这个恰当的地方就是异常处理程序,它的任务是将程序从错误状态中恢复,以使程序要么换一种方式运行,要么继续运行下去。


    捕获异常

    try {

        // Code that might generate execptions

    }


    异常处理程序

    try {

        // Code that might generate execptions

    } catch(Type1 id1) {

        // Handle execptions of Type1

    } catch (Type2 id2) {

        // Handle execptions of Type2

    } 

    // etc...


    异常说明

    异常说明使用了附加的关键字throws,后面接一个所有潜在异常类型的列表,所以方法定义可能看起来像这样:

    但是,要是这样写:

    void f() throws TooBig, TooSmall, DivZero {  // ...

    就表示此方法不会抛出任何异常


    异常基类Throwable的方法

    String getMessage();

    String getLocalizedMessage()

用来获取详细信息,或用本地语言表示的详细信息。

    String toString();

返回对Throwable的简单描述,要是有详细信息的话,也会把它包含在内。

    void printStackTrace()

    void printStackTrace(PrintStream)

    void printStackTrace(java.io.PrintWriter)

打印Throwable和Throwable的调用栈轨迹。调用栈显示了"把你待到异常抛出地点"的方法调用序列。其中第一个版本输出到标准错误,后两个版本允许选择要输出的流   

    Throwable fillInStackTrace()

用于在Throwable对象的内部记录栈帧的当前状态。这在程序重新抛出错误或异常时很有用 

    此外,也可以使用Throwable从其基类Object(也就是所有类的基类)继承的方法。对于异常来说,getClass()也许是各很好用的方法,它将返回一个表示此对象类型的对象。然后可以使用getName()方法查询这个Class对象包含包信息的名称,或者使用只产生类名称的getSimpleName()方法。


    栈轨迹

printStackTrace()方法所提供的信息可以通过getStackTrace()方法来直接访问,这个方法将返回一个由栈轨迹中的元素所构成的数组,其中每一个元素都表示栈中的一桢。元素0是栈顶元素,并且是调用序列中的最后一个方法调用(这个Throwable被创建和抛出之处)。数组中的最后一个元素和栈底是调用序列中的第一个方法调用。


    重新抛出异常

如果只是把当前异常对象重新抛出,那么printStackTrace()方法显示的将是原来异常抛出点的调用栈信息,而并非重新抛出点的信息。要想更新这个信息,那么调用fillInStackTrace()方法,这将返回一个Throwable对象。它是通过把当前调用栈信息填入原来那么异常对象而建立的。

    

    异常链

常常会想要在捕获一个异常后抛出另一个异常,并且希望把原始异常的信息保存下来,这被称为异常链。

Throwable的子类在构造器中都可以接受一个cause(因由)对象作为参数。这个cause就用来表示原始异常,这样通过把原始异常传递给新的异常,使得即使在当前位置创建并抛出了新的异常,也能通过这个异常链追踪到异常最初发生的位置。

    

    Java标准异常

Throwable这个Java类被用来表示任何可以作为异常被抛出的类。Throwable对象可分为两种类型(指从Throwable继承而得到的类型):Error用来表示编译时和系统错误(除特殊情况外,一般不用你关心)。Exception是可以被抛出的基本类型,在Java类库,用户方法以及运行时故障中都可能抛出Exception型异常。


    特例:RuntimeException

RuntimeException异常或从RuntimeException继承而来的异常,不需要在异常说明中声明方法将抛出RuntimeException类型的异常,它们也被称为"不受检查的异常"。


    使用finally进行清理

finally总会被执行,finally主要用来清理资源,包括:已经打开的文件或网络链接,在屏幕上画的图形,甚至可以是外部世界的某个开关。


    异常的限制

当覆盖方法的时候,只能抛出在基类方法的异常说明里列出的那些异常。


异常处理的一个重要原则是 "只有在你知道如何处理的情况下才捕获异常"。



    异常使用指南

应该在下列情况下使用异常:

1) 在恰当的级别处理问题。(在知道该如何处理的情况下才捕获异常。)

2) 解决问题并且重新调用产生异常的方法。

3) 进行少许修补,然后绕过异常发生的地方继续执行

4) 用别的数据进行计算,以代替方法预计会返回的值。

5) 把当前运行环境下能做的事情尽量昨晚,然后把相同的异常重抛到更高层。

6) 把当前运行环境下能做的事情尽量做完,然后把不同的异常抛到更高层。

7) 终止程序

8) 进行简化。(如果你的异常模式使问题变得太复杂,那用起来会非常痛苦也很烦人)

9) 让类库和程序更安全。(这既是在为调试做短期投资,也是为程序的健壮性做长期投资)





本文出自 “小城运维” 博客,请务必保留此出处http://lixcto.blog.51cto.com/4834175/1911237

java学习笔记第十二章html(代码片段)

JAVA学习笔记第十二章12.HTML不同页面利用锚点也可以进行跳转:<aname="1F"></a><h1>1F<h1><aherf="#1F">跳转到1F</a><aherf="index.html#1F">跳转到index页面的1F</a>表格标签,默认是没有边框的内嵌框架:框架集... 查看详情

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

...错。    三个操作系统的文件描述符映射到编程语言的标准库中,往往加了一层包装,但是名字通常还是叫标准输入,标准输出,标准出错。    在其它语言中的一般写法是:stdin,st 查看详情

第十二章笔记

                   类的无参方法学习本章用到的单词document:文档,文件display:展览method:方法vesrion:版本orient:东方,使适应parameter:参数since:自从,既然,因为 类的方法概述类是有一组具有相... 查看详情

cprimerplus读书笔记第十二章

...明符  主要的定义:作用域、链接以及存储时间。其他编程语言也有类似的概念。C语言通过这三个概念定义了5中存储类。其说明符分别为auto、register、static、extern和typedef。&n 查看详情

java第十二章继承笔记

Java第十二章 继承笔记一、使用继承:   1)方便修改代码   2)减少代码量二、super继承object类:super访问父类的无参构造;super指的是object的无参构造。   例:子类调用父类:super.属性/super.... 查看详情

“全栈2019”java第十二章:变量

难度初级学习时间10分钟适合人群零基础开发语言Java开发环境JDKv11IntelliJIDEAv2018.3文章原文链接“全栈2019”Java第十二章:变量下一章“全栈2019”Java第十三章:基本数据类型学习小组加入同步学习小组,共同交流与进步。方式一... 查看详情

第十二章随笔

  第十二章,Android下综合项目介绍之一随着社会电子信息化的不断发展,人们在居家中实验的电器越来越多,由此带来的安全隐患也越来越多,为了减少电器的不合理使用带来的异常情况,由此带来的安全隐患也有了明... 查看详情

第十二章-网络编程

1TCP/IP  IP协议赋值吧数据从一台计算机通过网络发送到另一台计算机.数据是被分割成一个个小块,然后通过IP包发送出去的.其中如何在负载的网络链路中传送的是通过路由器进行转发达到最终的目的地  TCP协议是建立在IP协... 查看详情

《java编程思想》学习笔记——第十五章泛型

    在面相对象编程中,多态算是一种泛化机制。    泛型实现了参数化类型的概念。    泛型的主要目的之一就是用来指定容器要持有什么类型的对象,而且由编译器来保证类型的正确... 查看详情

《java编程思想》学习笔记——第十一章持有对象

    JAVA容器类类库的用途是"保存对象",并将其划分为两个不同的概念:    1)Collection。一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,而Set不能用重复元... 查看详情

《java编程思想》学习笔记——第十四章类型信息

    运行时类型信息使得你可以在程序运行时发现和使用类型信息。    主要有两种方式:一种是"传统的"RTTI,它假定我们在编译时已经知道了所有的类型;另一种是"反射"机制,它允许我们在运行时发... 查看详情

第十二章异常处理

异常处理理论上由两种模型:1、终止模型:错误非常关键,一旦发生,程序不能在继续执行下去。无法挽回了。             2、恢复模型:异常处理的工作是恢复程序的工作。然后尝试重新调用出错的方法。(... 查看详情

《java编程思想》学习笔记——第十六章数组

    数组和其它种类的容器之间的区别有三方面:效率,类型和保存基本类型的能力。在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方式。数组就是一个简单的线性序列,这使得元素访问非常快... 查看详情

《java编程思想》学习笔记——第十三章字符串

    String对象是不可变的。查看JDk文档你就会发现,String类每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容。而最初的String对象则丝毫未动。+和StringBuilder&nbs... 查看详情

课程作业西瓜书机器学习课后习题:第十二章

...序猿|C++选手|学生简介:因C语言结识编程,随后转入计算机专业,获得过国家奖 查看详情

《opencl异构并行编程实战》补充笔记散点,第十二至十四章(代码片段)

?第十二章,在其他语言中使用OpenCL●JOCL(JavaBuildingforOpenCL),PyOpenCL●一个PyOpenCL的例子代码,需要pyopencl包1importpyopenclascl2importnumpyasnp3importnumpy.linalgasla45a=np.random.rand(50000).astype(np.float32)6b=np.random. 查看详情

《java程序设计》第七次学习总结(代码片段)

...出try块,都要执行finally字句。第十二章:recursion递归的思想:自己调用自己来解决问题。有个例子是:用decorate来解释decarate的意思。包括自己在学c语言时候就知道的用递归的方法来解决阶乘的问题。关于递归,新的收获有:其... 查看详情

第十二章抽象和封装

...)找出它的行为——方法名2.抽象的原则 根据面向对象的思想抽象出类3.类团的好处:直观、容易理解4.构造方法: 1)系统默认的无参构造  例如:    publicDog(){      this.name="大黄";      this.love="100”; ... 查看详情