前言

  在 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

浅谈Java异常处理机制的更多相关文章

  1. 浅谈java发射机制

    目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...

  2. 浅谈java反射机制

    目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...

  3. 浅谈java编译机制和运行机制

    源文件和字节码的组成方式 源文件: 拓展名后跟java的文件即java的源文件. Java 源码编译由以下三个过程组成: 1.分析和输入到符号表 2.注解处理 3.语义分析和生成class文件 流程图 ...

  4. 浅谈 java 反射机制

    一:Java反射概念 Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其mod ...

  5. 浅谈Java反射机制 之 使用类的 属性、方法和构造函数

    前面两篇我们总结了Java反射机制如何获取类的字节码,如何获取构造函数,属性和方法, 这篇我们将进一步验证如何使用我们获取到的属性.方法以及构造函数 1.使用 反射 获取到的 属性 import ja ...

  6. 浅谈Java反射机制 之 获取类的字节码文件 Class.forName("全路径名") 、getClass()、class

    另一个篇:获取 类 的 方法 和 属性(包括构造函数) 先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它 ...

  7. 浅谈Java回调机制

    像许多网上介绍回调机制的文章一样,我这里也以一个现实的例子开头:假设你公司的总经理出差前需要你帮他办件事情,这件事情你需要花些时间去做,这时候总经理肯定不能守着你做完再出差吧,于是就他告诉你他的手机号 ...

  8. 浅谈Java参数传递机制

    Java参数传递 ​ 才疏学浅,今天才知道Java中方法的参数是可以传递对象引用进去的. ​ Java的参数传递机制很简单,其实就是值传递. ​ 所谓值传递,也就是我们在给方法传递一个参数的时,传递的 ...

  9. 浅谈Java反射机制 之 获取类的 方法 和 属性(包括构造函数)

    上一篇 获取 类 的字节码文件 我们讲到了获取类的字节码文件的三种方法 第三种方法通过getClass("全路径名")获取字节码文件最符合要求 1.获取构造方法 先贴上我们要获取的 ...

  10. 浅谈Java的反射机制和作用

    浅谈Java的反射机制和作用 作者:Java大师 欢迎转载,转载请注明出处 很多刚学Java反射的同学可能对反射技术一头雾水,为什么要学习反射,学习反射有什么作用,不用反射,通过new也能创建用户对象 ...

随机推荐

  1. HarmonyOS SDK让小红书鸿蒙用户尽享原生相机的拍摄之美

    小红书是深受年轻人喜爱的生活社交类社区平台,越来越多的人在小红书上分享旅行.日常.心情.近日,不少使用鸿蒙原生版小红书的细心用户已经发现,直接使用小红书拍摄照片与自己使用原相机拍摄有一样清晰美观的呈现 ...

  2. 【由技及道】量子跃迁部署术:docker+jenkins+Harbor+SSH的十一维交付矩阵【人工智障AI2077的开发日志011】

    摘要: SSH密钥对构建的十一维安全通道 × Harbor镜像星门 × 错误吞噬者语法糖 = 在CI/CD的量子观测中实现熵减永动机,使容器在部署前保持开发与生产维度的叠加态 量子纠缠现状(技术背景) ...

  3. WARN  Issues with peer dependencies found,pnpm peer dependencies auto-install

    前言 pnpm 也需要设置自动安装对等依赖项 解决 pnpm 使用 npm 的配置格式,所以应该以与 npm 相同的方式设置配置: pnpm config set auto-install-peers ...

  4. workman PHPSocket.IO文档

    安装 请使用composer集成phpsocket.io. 脚本中引用vendor中的autoload.php实现SocketIO相关类的加载.例如 require_once '/你的vendor路径 ...

  5. 密码编码学与网络安全 原理与实践(第七版)William Stallings---读书笔记(1.1-1.5)

    密码编码学与网络安全 原理与实践(第七版)William Stallings---读书笔记 第一部分 概览 第1章 计算机与网络安全概念 密码算法与协议又可分为4个主要领域: 对称加密 加密任意大小的 ...

  6. Towards Accurate Alignment in Real-time 3D Hand-Mesh Reconstruction论文解读

    Towards Accurate Alignment in Real-time 3D Hand-Mesh Reconstruction论文解读 这是发表在ICCV2021的一篇文章,主要的工作内容是R ...

  7. English interview - how to show your skills in English during the interview process?(probably used in resume,cover letter)

    Formula We can use the formula below to express our skills in English. Formula: adv/adj + verb phras ...

  8. 【Linux】5.10 输入输出重定向

    Shell 输入/输出重定向 大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端.一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端.同样,一个命令 ...

  9. js调用datasnap rest server

    场景: 有嵌套的多层json数据结构的变量,js通过post调用 datasnap rest server,会出现问题: var json = [{ stcd: system.sn, dateTime ...

  10. java学习-5-核心类:字符串StringBuilder

    对字符串进行拼接,用java标准库提供的可变对象:StringBuilder. StringBuilder sb = StringBuilder(1024); for (int i = 0;i < ...