zoukankan      html  css  js  c++  java
  • 浅谈Java异常处理机制

    前言

      在 Java 中,异常被当作对象来处理,所有的异常都有一个共同的祖先java.lang.Throwable类。Throwable有两个重要的子类Exception(异常) 和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。先从整体看看异常类层次结构图,使我们对异常体系有一个大概的认识:

    Java异常类层次结构图,来源于参考文献1.

      Error:是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。

      Exception:是程序本身可以处理的异常,它有一个重要的子类 RuntimeException。RuntimeException 异常由Java虚拟机抛出,主要指编码、环境或者用户操作输入出现问题。

      注意,异常和错误的区别:异常能被程序本身处理,错误是无法处理的。使用try-catch-finally捕获异常,其捕获语法如下:

    try {
         需要被检测的代码;
    } catch(异常类 变量名) {
         异常处理代码;
    } fianlly {
          一定会执行的代码;
    }
    

    异常分类

      总体上我们根据Javac对异常的处理要求,将异常类分为2类,即非受检查异常和受检查异常。

      不受检查异常(unckecked exception):Error 和 RuntimeException 以及它们的子类。javac在编译时,不会提示和发现这样的异常,不要求在程序中处理这些异常。此类异常的出现常常是代码本身有问题造成的,应该从业务逻辑层面去解决并改进代码,而不是去通过异常处理机制解决。如分母为零的算术异常ArithmeticException,使用了空对象NullPointerException等等。

      受检查异常(checked exception):除了 Error 和 RuntimeException的其它异常。javac强制要求程序员处理这样的异常,要么用try-catch语句捕获,要么用throws子句声明抛出;否则,直接导致编译失败。这样的异常一般是由程序的运行环境导致的,因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用这些程序,于是就应该为这样的异常时刻准备着如FileNotFoundException 等。

      需要明确的是:受检查和非受检查是对于javac来说的,这样就很好理解和区分了。

    常见异常及其分类

      面试官也可能让你举出几个常见的异常情况并将其分类,未雨绸缪,下面列出了一些 Java 中常见的异常及其分类。

    RuntimeException

    1. 数组下标越界异常 ArrayIndexOutOfBoundsException;

    2. 空指针异常 NullPointerException;

    3. 类型转换异常 ClassCastException;

    4. 非法参数异常 IllegalArgumentException。

    UncheckedException

    1. 指定变量不存在异常 NoSuchFieldException 。

    常见问题

    1. Excption与Error的关系是什么?
      Excption与Error都是Throwable的子类。
      Error和Exception的区别:Error通常是灾难性的、致命的错误,是程序无法控制和处理的。当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程。Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的捕获这些异常。

    2. 如何自定义一个异常?
      通过继承一个异常类自定义异常,运行时异常继承 RuntimeException,编译时异常继承 Exception。

    3. try-catch-finally,try中有return,finally还执行吗?
      执行。finally代码块的执行在return之前,不管try中是否有异常,它都执行。温馨提示,如果finally中有return,则会在try的return之前执行,导致不执行try中的return。

    4. throw 和throws关键字的区别
      throw用于在函数内抛出异常对象,后面跟的是异常对象。
      throws用于在方法声明上抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。

      例如:

    static void demoException() throws Exception {
         throw new Exception("error msg");
    }
    
    1. 举个内存溢出的例子
    public static void main(String[] args) {
          //java.lang.OutOfMemoryError 内存溢出错误
       byte[] buf = new byte[1024*1024*700];
    }
    

    小结

      以上就是这篇文章的全部内容了,希望本文对大家的学习或者工作能带来一定的帮助,如有疑问请留言交流。Wiener在此祝各位生活愉快!工作顺利!

    Reference

    1.  https://www.cnblogs.com/lulipro/p/7504267.html


      读后有收获,小礼物走一走,请作者喝咖啡。

    赞赏支持

  • 相关阅读:
    Docker容器(一):什么是Docker
    使用docker简单启动springboot项目
    nginx的alias与root的区别
    拦截器报循环依赖错误
    给jenkins更换工作空间
    The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    No Compiler is Provided in this environment Perhaps you are running on JRE rather than a JDK
    idea拉取最新代码弹窗(Ctrl + T)
    idea常用插件
    SqlDependency数据库缓存
  • 原文地址:https://www.cnblogs.com/east7/p/14494808.html
Copyright © 2011-2022 走看看