软件构造总结3-异常和断言

  之前从来没有接触过异常和断言,最后一节课感觉并没有学的非常明白,所以搜集了一些资料,来总结一下异常和断言的内容,并且总结一下复习完软件构造的感觉,希望后天能考好。

  在理想的世界中,用户输入的数据格式永远是正确的,选择打开的文件也一定存在,代码永远不会出bug。但是,我们总是要假设用户会输入各种可能让程序崩溃的输入,当发生异常时,我们应该尽可能做到以下几点,向用户通知错误,保存所有的工作,允许用户妥善地退出程序。

一、异常的分类

  在Java当中,异常的对象都是派生于一个Throwable的一个接口,所有的异常都由Throwable继承而来,在下一层分解为两个分支:Eorrer和Exception。Eorrer描述了Java运行时系统的内部错误和资源耗尽错误 ,我们的程序不应该抛出这样的错误,当产生这种错误时,我们几乎无能为力。Exception又分解为两个分支,由编程错误导致的RuntimeException,比如错误的强制类型转换,数组访问越界等,由I/O错误导致的其他异常IOException,比如试图打开一个不存在的文件等。Java语言规范将派生于Error类或RuntimeException类的所有异常成为非检查型(unchecked)异常,所有其他的异常成为检查型(checked)异常。

  

 

 

二、声明检查型异常

  我们要在方法的后面声明这个方法可能抛出的检查型的异常,告诉编译器有可能发生什么错误。但是我们不必声明这个方法可能抛出的所有异常,只需要记住以下的四种情况:1.调用了一个抛出检查型异常的方法;2.检查到一个错误,并利用throw语句抛出一个检查型异常;3.程序出现错误会自动抛出一个非检查型异常。(如除以零的错误);4.java虚拟机或运行时库出现的错误。对于前两种情况,我们必须声明这个方法可能会抛出的异常,保证程序员用处理器获取检查型的异常。

  总之,一个方法必须声明所有可能抛出的检查性异常,而非检查型的异常要么在控制之外(Error),要么是由从一开始就应该避免的情况所导致的(RuntimeException)。如果方法没有声明所有可能发生的检查型的异常,编译器就会发出一个错误消息。

三、捕获异常

  如果发生了某个异常,但是没有在任何地方捕获这个异常,程序就会终止,并在控制台上打印一个消息,其中包括这个异常的类型和一个堆栈轨迹。要捕获一个异常,需要使用try/catch语句,其使用的规则如下:1.如果try语句块之间出现了catch子句指定的异常类,那么程序就会跳过try语句块中剩余的代码,并执行catch语句块中的异常处理器代码;2.如果没有产生异常,那么程序会跳过catch语句;3.如果方法中抛出了catch子句中没有声明的一个异常类型,那么这个方法就会立即退出。在一个try语句块中可以捕获多个异常类型,并对不同类型的异常做出不同的处理。具体的例子如下所示:

  代码抛出一个异常时,就会停止处理这个方法的剩余代码,并退出这个方法,如果此时还有代码需要执行,比如资源关闭的代码,那就需要使用finally语句。程序可能在以下三种情况下执行finally字句:1.代码没有抛出异常。此时,程序首先执行完try语句块中的代码,然后执行finally语句块的代码。随后,继续执行finally语句块之后的代码;2.代码抛出一个异常,并在一个catch子句中捕获。此时,程序将执行try语句块中的代码,直到抛出异常,之后,进入对应的catch子句执行其代码,最后执行finally语句块的代码。(1)如果catch中没有继续抛出异常,那么在finally之后会继续执行后续代码;(2)如果catch中抛出异常了,那么finally之后方法终止,回到方法的调用者;3.代码抛出一个异常,并且没有被catch捕获。此时,程序将执行try语句块中的代码,直到抛出异常后,直接直接finally语句,之后方法终止,返回到方法的调用者。

四、断言

  断言机制运行在测试期间插入一些检查,而在生产代码中会自动删除这些检查。assert的使用有两种形式:

  默认情况下,断言是禁用的,可以在运行程序是用-eaableassertions或者-ea启动断言:

  也可以使用-disableassertions或-da禁用断言,不必重新编译程序来启动或禁用断言,启动或禁用断言是类加载器的功能。禁用断言时,类加载器会取出断言代码。因此不会影响程序实际运行的效率。

 

五、最后的总结

  截止到这一刻,我终于把软构复习完了,总结一下这门课的感受,之前学过一些java的语法,觉得会编一些基本的程序,但是学完软构之后,觉得自己已经能站在软件工程师的角度,设计ADT,编写spec,利用各种设计模式处理不同ADT之间的关系,觉得对于编写一个可复用的可扩展的ADT更加得心应手,还是要多编代码积累经验呀,坚持写博客,就写到这吧,希望后天的考试能取得好成绩。

posted on 2022-06-13 23:45  renjie_master  阅读(143)  评论(0)    收藏  举报

导航