浅谈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
数组下标越界异常 ArrayIndexOutOfBoundsException;
空指针异常 NullPointerException;
类型转换异常 ClassCastException;
非法参数异常 IllegalArgumentException。
UncheckedException
- 指定变量不存在异常 NoSuchFieldException 。
常见问题
Excption与Error的关系是什么?
Excption与Error都是Throwable的子类。
Error和Exception的区别:Error通常是灾难性的、致命的错误,是程序无法控制和处理的。当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程。Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的捕获这些异常。如何自定义一个异常?
通过继承一个异常类自定义异常,运行时异常继承 RuntimeException,编译时异常继承 Exception。try-catch-finally,try中有return,finally还执行吗?
执行。finally代码块的执行在return之前,不管try中是否有异常,它都执行。温馨提示,如果finally中有return,则会在try的return之前执行,导致不执行try中的return。throw 和throws关键字的区别
throw用于在函数内抛出异常对象,后面跟的是异常对象。
throws用于在方法声明上抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。
例如:
static void demoException() throws Exception {
throw new Exception("error msg");
}
- 举个内存溢出的例子
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异常处理机制的更多相关文章
- 浅谈java发射机制
目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...
- 浅谈java反射机制
目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...
- 浅谈java编译机制和运行机制
源文件和字节码的组成方式 源文件: 拓展名后跟java的文件即java的源文件. Java 源码编译由以下三个过程组成: 1.分析和输入到符号表 2.注解处理 3.语义分析和生成class文件 流程图 ...
- 浅谈 java 反射机制
一:Java反射概念 Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其mod ...
- 浅谈Java反射机制 之 使用类的 属性、方法和构造函数
前面两篇我们总结了Java反射机制如何获取类的字节码,如何获取构造函数,属性和方法, 这篇我们将进一步验证如何使用我们获取到的属性.方法以及构造函数 1.使用 反射 获取到的 属性 import ja ...
- 浅谈Java反射机制 之 获取类的字节码文件 Class.forName("全路径名") 、getClass()、class
另一个篇:获取 类 的 方法 和 属性(包括构造函数) 先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它 ...
- 浅谈Java回调机制
像许多网上介绍回调机制的文章一样,我这里也以一个现实的例子开头:假设你公司的总经理出差前需要你帮他办件事情,这件事情你需要花些时间去做,这时候总经理肯定不能守着你做完再出差吧,于是就他告诉你他的手机号 ...
- 浅谈Java参数传递机制
Java参数传递 才疏学浅,今天才知道Java中方法的参数是可以传递对象引用进去的. Java的参数传递机制很简单,其实就是值传递. 所谓值传递,也就是我们在给方法传递一个参数的时,传递的 ...
- 浅谈Java反射机制 之 获取类的 方法 和 属性(包括构造函数)
上一篇 获取 类 的字节码文件 我们讲到了获取类的字节码文件的三种方法 第三种方法通过getClass("全路径名")获取字节码文件最符合要求 1.获取构造方法 先贴上我们要获取的 ...
- 浅谈Java的反射机制和作用
浅谈Java的反射机制和作用 作者:Java大师 欢迎转载,转载请注明出处 很多刚学Java反射的同学可能对反射技术一头雾水,为什么要学习反射,学习反射有什么作用,不用反射,通过new也能创建用户对象 ...
随机推荐
- 【C++】开源:ImGui图形用户界面库配置与使用
项目介绍 项目Github地址:https://github.com/ocornut/imgui Dear ImGui (ImGui) 是一个开源的.用 C++ 编写的图形用户界面(GUI)库.它由O ...
- pycharm debug调试【Mute Breakpoints】【Run to Curson】按钮
1.Debug 调试时,红色妞变为灰色怎么办 Mute Breakpoints:哑的断点,选择这个后,所有断点变为灰色,断点失效,按F9则可以直接运行完程序.再次点击,断点变为红色,有效.如果只想使某 ...
- cypress 在 typescript 项目中报错找不到 'tslib'
原文链接:https://blog.jijian.link/2020-08-11/cypress-typescript-cannot-find-module-tslib/ cypress 在 type ...
- nodejs 图片添加水印(png, jpeg, jpg, gif)
同步发布:https://blog.jijian.link/2020-04-17/nodejs-watermark/ nodejs 作为一个脚本语言,图片处理这方面有点弱鸡,无法跟 php 这种本身集 ...
- Caddy web服务器
caddy 中文文档:https://caddy2.dengxiaolong.com/docs/ 常用命令 命令 描述 caddy run 启动Caddy服务器 caddy reload 重载Cadd ...
- element-ui和ant-design-vue 数字输入框只能输入大于等于1的整数
限制输入的是大于等于1的整数 <template> <div> <h1>ant-design-vue 1.xx</h1> <a-input-num ...
- 为什么AI教师难以实现
提供AI应用咨询+陪跑服务,有需要回复1 本周为一家教育公司提供了全天的AI的培训,后续涉及AI+教育领域的项目开发,而我去年就做过AI教师项目,所以对AI+教育有一定熟悉度. 下来后又拜访了一家互联 ...
- linux 根目录与分区
1.2 根目录的建立 大家一般都会知道根目录的产生方式,就是系统使用mount指令,将系统所在的分区挂载到[/]目录中,这样便完成了所谓的根目录.但你是否想过, 虽然看起来合理却有点诡异,因为根目录 ...
- python-argparse用法简介
1. argparse介绍 argparse是Python标准库中用于解析命令行参数的模块.它提供了一种简洁而灵活的方式来处理命令行参数,包括选项(可选参数)和位置参数(必需参数) 2. argpar ...
- CoreOS 手动更新
以阿里云 ECS 安装的 CoreOS 为例,你家装的 CoreOS 基本也一样啦. 查看和修改更新组 第一个问题:"什么是更新组?",请先看CoreOS 发行版本介绍 # 查看更 ...