专栏首页JantiJava基础巩固——异常

Java基础巩固——异常

基础回顾

什么是异常?

  在Java程序运行时,常常会出现一些非正常的现象,这种情况称为运行错误。根据其性质可以分为错误和异常。

Java程序中所有抛出的异常都必须从Throwable派生而来。类Throwable有两个直接子类:Error和Exception.

  一般来说,最常见的错误有程序进入死循环、内存泄露等。这种情况下,程序运行时本身无法解决问题,只能通过其他程序干预。Java对应的类为Error类。Error类对象由Java虚拟机生成并抛弃(通常Java程序不对这类异常进行处理)。

  异常是程序执行时遇到的非正常情况或意外行为。以下这些情况一般都可以引发异常;代码或调用的代码中有错误,操作系统资源不可用,公共语言运行库遇到意外情况。常见的有数组下标越界、算法溢出、除数为零、无效参数、内存溢出等。这种情况不像错误那样,程序运行时本身可以解决,由异常代码调整程序运行方向,使程序仍可继续运行,直至运行结束。

  Java异常对应的类为Exception类。Exception类对象是Java程序处理或者抛弃的对象,它有各种不同的子类分别对应与不同类型的异常。Java编译器要求程序必须捕获或声明所有的非运行时异常,但对于运行时异常可以不做处理。其中类RuntimeException代表运行时由Java虚拟机生成的异常,原因是编程错误。其他则为非运行时异常,原因是程序碰到了意外情况,如输入\输出异常IOException等。

异常关键字

  Java异常处理的关键语句有五个:try、catch、throw、throws、finally。其中try、catch、finally三个语句块应注意的问题如下。

  1.try、catch、finally三个语句均不能单独使用,三者可以组合,try---catch---finally、try---catch、try---finally三种结构,catch语句可以有一个或者多个,finally语句最多一个。

  2.try、catch、finally三个代码块中变量的作用域为代码块内部,分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。

  3.若有多个catch块,只会匹配其中一个异常类并执行catch块代码,而不会执行再执行别的catch块,并且匹配catch语句的顺序是由上到下的。

  4.throw关键字用于方法体内部,用来抛出一个Throwable类型的异常。如果抛出了检查异常,则还应该在头部声明方法可能抛出的异常类型。该方法的调用者必须检查抛出的异常。如果所有的方法都层层上抛获取的异常,最终JVM会进行处理会进行处理,就是打印异常消息和堆栈信息。如果抛出的Error或RuntimeException,则该方法的调用者可选择处理该异常。

  5.thorws关键字用于方法体外部的方法声明部分,用来声明方法可能会抛出某些异常。仅当抛出了检查异常,该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出,而不是囫囵吞枣地打印堆栈信息来处理。

异常处理中常见的问题

  1.过于庞大的try块

  某些程序把大量的代码块放入当个try块,试图用一个catch语句捕获所有的异常和处理所有可能出现的异常,实际上这是一个坏习惯。原因就在于为了图省事,不愿花时间分析一大块代码中哪几行会抛出异常、异常的具体类型是什么。把大量的语句装入单个巨大的try块就像是出门旅游时把全部家当塞入集装箱带走,虽然东西带上了,但要找出来可不容易。

  对于这种问题,可以设置多个异常抛出点来解决。异常对象从产生点产生后,到被捕捉后终止生命的全过程中,实际上是一个传值的过程,所以,应根据实际来合理控制异常个数。catch语句表示会出现某种异常,而且希望能够处理该异常。所以语句中就应该尽量具体异常类型,也可以使用多个catch,用于分别处理不同的异常。

  2.异常的完整性

  在Java语言中,如果一个函数运行时可能会向上层调用者函数抛出一个异常,那么,他就必须在该函数的声明中显示地注明(采用throws关键字)。否则编译器会抛出错误信息“must be caught or declared to be thrown”,其中“must be caught”指在Java的异常处理模型中,要求所有被抛出的异常都必须有对应的“异常处理模块”。如果你在程序中利用throw出现一个异常,那么在你的程序中,就必须要用catch处理这个异常。

  3.RuntimeException异常

  在Java异常处理中,一般有两类异常:其一,就是通过throw语句,程序员在代码中人为的抛出的异常;另外一个是系统运行时异常,例如:被零除,空字符串,无效句柄等,对于这类异常,程序员实际上完全可以避免它,只要我们写代码时足够小心严谨。因为,为了彻底解决这种隐患,提高程序整体可靠性,使用RuntimeException异常就是为了实现这样的功能。

  针对RuntimeException类型的异常,javac是无法通过编译的静态语法检测来判断到底哪些函数可能抛出这类异常,也这因为如此,Java异常处理模型中“must be caught or declared to be thrown”规则也不适用于次。当然RuntimeException也可以被程序显示地抛出,而且为了程序的可靠性,对一些可能出现的运行时异常的代码区域,程序员最好能够及时的处理这些异常。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PKI信息安全知识点详细解答包含HTTPS

    1. 什么是X.509? X.509标准是ITU-T设计的PKI标准,他是为了解决X.500目录中的身份鉴别和访问控制问题设计的。 2. 数字证书 数字证书的意...

    Janti
  • 每天学一点Docker(6)——镜像和DockerFile

    镜像的分层结构: 实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。比如我们现在构建一个新的镜像,Do...

    Janti
  • Http学习笔记

       在HTTP工作开始前,浏览器首先要通过网络与服务器建立连接,该连接是通过TCP来完成的。HTTP是比TCP更高层次的应用层协议,根据规则,只有底层协议建立...

    Janti
  • Java基础系列(三十一):异常

    假如在一个Java程序运行期间出现了一个错误,这个错误可能是由于文件包含了错误的信息,或者由于网络连接出现超时,或者就因为使用了无效的数组下标,或者试图使用一个...

    山禾说
  • 深入理解 Java 异常

    Throwable 是 Java 语言中所有错误(Error)和异常(Exception)的超类。

    静默虚空
  • Java异常总结和Spring事务处理异常机制浅析

    Thorwable类所有异常和错误的超类,有两个子类Error和Exception,分别表示错误和异常。其中异常类Exception又分为运行时异常(Runti...

    IT大咖说
  • JavaSE 基础学习之四 —— 异常处理

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/...

    剑影啸清寒
  • java提高篇之异常(下)

    Java确实给我们提供了非常多的异常,但是异常体系是不可能预见所有的希望加以报告的错误,所以Java允许我们自定义异常来表现程序中可能会遇到的特定问题,总之就是...

    哲洛不闹
  • 异常处理

    Exception又分为运行异常(RuntimeException和其下子类)和其他类属于编译时异常

    木瓜煲鸡脚
  • 第33节:Java面向对象中的异常

    Exception:RuntimeException为空指针异常,数组下标越界异常,算数异常,类型转换异常等,IO异常(IOException),SQL异常(S...

    达达前端

扫码关注云+社区

领取腾讯云代金券