前言

大家在写代码的过程中,异常是不可能完全避免的,那么我们在尽可能规避错误的同时,还要注意如何去捕获和处理异常,此文带你详细理解Java的异常体系。

定义

Java异常指在程序运行时可能出现的一些错误,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,中断了正在执行的程序的正常指令流。

体系结构

Thorwable类(表示可抛出)是所有异常和错误的超类,两个直接子类为Error和Exception,分别表示错误和异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常, 这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。

Error:由Java虚拟机生成并抛出,Java程序不做处理。

Runtime Exception:由系统检测, 用户的Java 程序可不做处理,系统将它们交给缺省的异常处理程序。

IOException(程序中的问题,可预知的): Java编译器要求Java程序必须捕获或声明所有的非运行时异常。

throw:用户自己产生异常。

异常体系结构

异常之间的区别与联系

  • Error与Exception

Error是程序无法处理的错误,它是由JVM产生和抛出的,比如OutOfMemoryError、ThreadDeath等。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。

Exception是程序本身可以处理的异常,这种异常分两大类:运行时异常和非运行时异常。程序中应当尽可能去处理这些异常。

  • 运行时异常和非运行时异常

运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

异常处理

常用关键字:try、catch、throw(抛出一个异常,动词)、throws(声明一个方法可能抛出的异常)、finally。

  • throws (声明异常)

  若方法中存在检查时异常,如果不对其捕获,那必须在方法头中声明该异常,以便于告知方法调用者此方法有异常,需要进行处理。

  在方法中声明一个异常,方法头中使用关键字throws,后面接上要声明的异常。若声明多个异常,则使用逗号分割。

  若是父类的方法没有声明异常,则子类继承方法后,也不能声明异常。

  • try-catch(捕获异常)

  若执行try块的过程中没有发生异常,则跳过catch子句。若是出现异常,try块中剩余语句不再执行。开始逐步检查catch块,判断catch块的异常类实例是否是捕获的异常类型。匹配后执行相应的catch块中的代码。如果异常没有在当前的方法中被捕获,就会被传递给该方法的调用者。这个过程一直重复,直到异常被捕获或被传给main方法(交给JVM来捕获)。

  对于try..catch捕获异常的形式来说,对于异常的捕获,可以有多个catch。对于try里面发生的异常,它会根据发生的异常和catch里面的进行匹配(按照catch块从上往下匹配),如果有匹配的catch,它就会忽略掉这个catch后面所有的catch。

  如果有finally的话进入到finally里面继续执行。

  try ctach fianally 中有return 时,会先执行return ,但是不会返回。在执行完 finally 后进行返回。

  • finally

用来创建在 try 代码块后面执行的代码块。无论是否发生异常,finally 代码块中的代码总会被执行。

总结

①写代码时可以合理规避异常,同时辅助 try-catch 处理。

②在多重 catch 块后面,可以加一个 catch(Exception)来处理可能会被遗漏的异常。

③对于不确定的代码,也可以加上 try-catch,处理潜在的异常。

④尽量去处理异常,切忌只是简单地调用 printStackTrace() 去打印输出。

⑤尽量添加 finally 语句块去释放占用的资源(IO)。

try catch异常后会执行后面的代码吗_Java的异常体系相关推荐

  1. try catch异常后会执行后面的代码吗_JVM异常处理最强讲解

    各种编程语言都有自己的异常捕获.处理方式.在程序指令执行过程中,可能会发生可预知或不可预知的各种异常.通过异常捕获和处理可以记录相关异常日志,执行一些补救策略,让局部的错误不影响服务整体可用性. 那么 ...

  2. SpringBoot配置在应用启动后立即执行某些方法代码案例

    springboot给我们提供了两种"开机启动"方式:ApplicationRunner和CommandLineRunner. 这两种方法提供的目的是为了满足,在项目启动的时候立刻 ...

  3. php 代码延迟执行,php和js编程中的延迟执行效果的代码

    php和js编程中的延迟执行效果的代码 php sleep(10); usleep(10); js里的 setInterval("方法", 100); PHP sleep() 函数 ...

  4. java try catch 异常后还会继续执行吗

    java try catch 异常后还会继续执行吗? catch 中如果你没有再抛出异常 , 那么catch之后的代码是可以继续执行的 , 但是try中 , 报错的那一行代码之后 一直到try结束为止 ...

  5. oracle 跳出内层循环,内层程序中发生异常后,不会继续执行外层程序的语句

    开发写了个存储过程需要我们审批,发现子程序中使用了异常处理语句, 通过以下实验说明这种写法的问题: SQL> create table test_number(test_id number); ...

  6. java实训 :异常(try-catch执行顺序与自定义异常)

    关键字: try:执行可能产生异常的代码 catch:捕获异常 finally:无论是否发生异常代码总能执行 throws:声明方法可能要抛出的各种异常 throw:手动抛出自定义异常 用 try-c ...

  7. java 异常后重试_java – 异常后自动重试的功能

    如果抛出一些异常,我已经使这个抽象类自动重试网络调用. >我在InterruptedException&之后注意不要重试 的UnknownHostException. >我重试了5 ...

  8. 为什么await()后会执行lock.unlock,await()时不就释放锁了吗

    为什么await()后会执行lock.unlock,await()时不就释放锁了吗 1 是的,释放锁是为了别的线程获得,是为了线程间的通信,是临时释放的,真正满足继续向下执行条件后,被唤醒后获得了锁, ...

  9. try、catch、finally的执行顺序

    有这样一段代码 : public class EmbededFinally { public static void main(String args[]){ int result; try { Sy ...

最新文章

  1. C++ 预编译的时候使用defined 的含义
  2. python消息队列模块_day43-python消息队列二-queue模块
  3. Python模拟Linux/Mac OS工具grep和Windows工具findstr
  4. 图文详解贷中监控报表与资产质量分析全过程
  5. C语言实现2048小游戏
  6. centos 7 163 yum 源 python 2.7.5
  7. DataTable转成字符串复制到txt文本
  8. Excel数据转换成SQL
  9. CocosCreator中TiledMap简单使用
  10. Bootstrap从入门到精通(全)
  11. 图像识别的原理、过程、应用前景,精华篇!
  12. php使用逻辑运算符提交程序运行效率
  13. Raspberry pi设置Samba
  14. ssm南工二手书交易平台毕业设计源码172334
  15. 作业成本法中的成本动因分析----by AMT 邓为民
  16. 浏览器存储的方式有哪些
  17. 平面向量加法 (15 分)
  18. 易康中如何提取特征并进行重要性排序
  19. 协程爬取整站豆瓣网络
  20. SqlServer 中的触发器

热门文章

  1. 正则匹配字符串有则替换无则添加;用正则实现添加和替换字符串,原字符串中包含某字段就替换(覆盖),不包含某字段就添加!
  2. 代码中如何让无序标记的内容并排_英语技术文档中如何正确使用无序列表和有序列表?...
  3. paramiko模块_玩转网络自动化之Netmiko模块
  4. 怎么调试内存溢出的c++代码_使用jvisualvm排查一次内存溢出(OOM)过程
  5. 雪花算法id长度_分布式全局ID生成器(雪花算法golang无锁版)
  6. python中字符串函数的用法_python中字符串内置函数的用法介绍(代码)
  7. c++ 写x64汇编 5参数_第9篇-C/C++ x86_64的函数栈
  8. 1431.拥有最多糖果的孩z
  9. AWT_addMouseListener鼠标监听事件(Java)
  10. 解决微信调整字体大小导致Html5页面混乱