Java语言提供了相对完善的异常处理机制。注意,这里的异常实际上包含了后面要说的“错误”和“异常”,即Error和Exception。

一、Java异常分类

错误和异常

在Java中,所有的错误和异常有一个共同的祖先 Throwable类,这意味着这些错误和异常可以被捕获(catch)和抛出(throw)。Throwable的两个重要子类:Error(错误)和Exception(异常),此二者是有区别的。

Error:程序无法处理的、比较严重的错误,一般会使得JVM处于非正常且不可恢复的状态,如常见的OutOfMemoryError、StackOverflowError等。Error是不可查的。

Exception:是可以用针对性的代码处理的异常。

一言以蔽之:Error不可被程序本身处理,Exception可以被程序本身处理。

编译时异常和运行时异常

Exception有两类子类,即RuntimeException和非RuntimeException。RuntimeException即运行时异常,非RuntimeException就是编译时异常。它们又分别可被叫做不受检异常受检异常,此二者是有区别的。

编译时异常(受检异常):编译器要求必须写相应代码去处理此类异常,否则不能通过编译。Java把一些比较常见的异常设计为编译时异常,如FileNotFoundException、ClassNotFoundException和SQLException等。

运行时异常(不受检异常):编译器不强制对这些异常进行处理,当然也可以处理。

二、Java异常处理机制

Java的异常处理机制为:抛出异常,捕获异常。

抛出异常:抛出异常有两种方式:发生异常时由运行时系统自动抛出、程序员手动抛出(throws xxxException)。对于系统抛出的异常,当一个方法引发异常时,方法会创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行之。对于手动抛出的异常,是程序员通过throw xxxException抛出。

捕获异常:方法抛出异常之后,运行时系统将转而寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。

对于系统抛出的异常,有两种处理方式:自己处理或者向上抛。

1. 自己处理:try-catch,在catch字句中处理。

2. 向上抛:

2.1 try-catch,在catch字句中打印日志、生成新的更具可读性的异常对象并throw出去,并在方法名后面声明抛出。

2.2 不try-catch,方法名后面声明抛出,这时候抛出去的时原始异常对象。

对于手动抛出的异常,直接在方法名后面声明抛出就行了,其实也可以利用try-catch,但是你自己手动抛出了异常,又自己捕获住,何所为?

三、try-catch

关键词try后的一对大括号将一块可能发生异常的代码包起来,称为监控区域。Java方法在运行过程中出现异常,则创建异常对象。将异常抛出监控区域之外,由Java运行时系统试图寻找匹配的catch子句以捕获异常。若有匹配的catch子句,则运行其异常处理代码,try-catch语句结束。

  匹配的原则是:如果抛出的异常对象属于catch子句的异常类,或者属于该异常类的子类,则认为生成的异常对象与catch块捕获的异常类型相匹配。

需要注意的是,一旦某个catch捕获到匹配的异常类型,将进入异常处理代码。一经处理结束,就意味着整个try-catch语句结束。其他的catch子句不再有匹配的机会。

try-catch后面的代码:如果catch匹配到了try中抛出的异常,且进行了处理、不再抛出、没有产生新的异常,则try-catch结束后还会执行后面的代码。否则,不执行。

四、try-catch-finally

无论是否出现异常,finally子句都会执行。try-catch-finally执行顺序和规则。

1) 当try没有捕获到异常时:try语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句;

  2) 当try捕获到异常,catch语句块的异常类型不匹配:此异常将会抛给JVM处理,finally语句块里的语句还是会被执行,但finally语句块后的语句不会被执行;

  3) 当try捕获到异常,catch语句块的异常类型匹配:在try语句块中是按照顺序来执行的,当执行到某一条语句出现异常时,程序将进入第一个匹配的catch语句块,而try语句块中,出现异常之后的语句也不会被执行,catch语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句;

4) 若在try或catch中有return且能被执行到时,在return之前会先执行finally子句。注意,在进入finally之前会先把return后的表达式计算出并保存起来,finally执行之后,回去将此值返回,所以函数返回值是在finally执行前就已确定的。不过,如果finally中也有return,那么程序在finally中就提前返回了,返回值也不会是try或catch中保存的值。故finally中最好不要包含return,否则程序会提前退出。

参考文章

深入理解Java异常处理机制 - 张顺海 - 博客园

有return的情况下try catch finally的执行顺序 - 张顺海 - 博客园

Java异常处理机制(基础知识)相关推荐

  1. java中的异常处理语句_Java中实现异常处理的基础知识

    Java中实现异常处理的基础知识 异常 (Exception):发生于程序执行期间,表明出现了一个非法的运行状况.许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象. 例如:数组越界和被0除. ...

  2. 简述java异常处理机制

    引言: Hello,我的好朋友们,又到我们相聚的时间了,今天我要和大家分享一些有关java异常处理的相关 知识,也是通过老师的讲解和相关材料的借鉴之后的一个比较系统的总结,真心希望写完这篇文章的我和看 ...

  3. Java程序员从笨鸟到菜鸟之(十二)java异常处理机制

    异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出 ...

  4. Java异常处理机制很有意思

    版权声明:欢迎转载,请注明沉默王二原创. https://blog.csdn.net/qing_gee/article/details/43015379 前言:在网络上看到一篇<深入理解Java ...

  5. Java异常处理深入理解_关于java异常处理机制的深入理解.doc

    关于java异常处理机制的深入理解.doc 关于JAVA异常处理机制的深入理解1引子TRYCATCHFINALLY恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过 ...

  6. 简述java的异常处理机制_简述java异常处理机制

    引言: Hello,我的好朋友们,又到我们相聚的时间了,今天我要和大家分享一些有关java异常处理的相关 知识,也是通过老师的讲解和相关材料的借鉴之后的一个比较系统的总结,真心希望写完这篇文章的我和看 ...

  7. 谈谈你对Java异常处理机制的理解

    谈谈你对Java异常处理机制的理解 先谈谈我的理解:异常处理机制可以说是让我们编写的程序运行起来更加的健壮,无论是在程序调试.运行期间发生的异常情况的捕获,都提供的有效的补救动作,任何业务逻辑都会存在 ...

  8. 第76节:Java中的基础知识

    第76节:Java中的基础知识 设置环境,安装操作系统,安装备份,就是镜像,jdk配置环境,eclipse下载解压即可使用,下载tomcat 折佣动态代理解决网站的字符集编码问题 使用request. ...

  9. 黑马程序员 一、java 概述与基础知识

    获取更多资源关注Java帮帮IT资源分享网 一.黑马程序员-java 概述与基础知识 1.何为编程? 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果 的过程. 为了使 ...

  10. Java 网络编程基础知识

    Java 网络编程基础知识 基础概念 计算机网络的基本概念 ​ 网络:多台计算机使用网络设备互联在一起,计算机之间可以进行通信,这样就组成了一个计算机网络. ​ 网络设备:集线器(HUB),路由器,交 ...

最新文章

  1. Spring学习2之helloSpring
  2. linux入门_韩顺平_复习版_文件目录类
  3. 解决GetManifestResourceNames()无法读取资源文件
  4. 实例48:python
  5. 阿里云asp主机 后台登录一直提示验证码错误_吐槽一下阿里云关于网站备案的问题,真让人恶心生厌!...
  6. Linux中ping不通外网解决方案
  7. vue引入萤石云监控进行播放
  8. Dbviusalizer报错Java.lang.ClassCastException: javax.swing.KeyStroke cannot be cast to java.lang.Compar
  9. 51单片机蜂鸣器演奏《我和我的祖国》
  10. Java——通过Java代码从ftp服务器下载文件
  11. Python项目实战:使用selenium爬取拉勾网数据
  12. 防止外包不给钱 php,程序员接私活,怎样防止做完不给钱?
  13. 秋招一个半月流水账+招银网路科技offer
  14. CSDN每日打卡已经2周,进展如何?,【2021Python最新学习路线】
  15. Android Apk瘦身方案1——R.java文件常量内联
  16. android Tether 分析
  17. 性能测试瓶颈分析与系统调优(1)项目部署与测试环境工具安装
  18. 计算机网络(二)集线器_网桥交换机_路由器
  19. 正则表达式(三)正则的捕获
  20. python:输入一个整数正序各个输出,并判断输出位数

热门文章

  1. PHPCMS 使用图示和PHPCMS二次开发教程(转)
  2. [转载] 七龙珠第一部——第068话 最后的龙珠
  3. 我的Java开发学习之旅------Java ClassLoader解析一(转)
  4. 好好学习,好好Show
  5. 一路去**ddss第4天
  6. 应用多元统计分析第五章判别分析例题python代码
  7. ERROR 1201 (HY000) Could not initialize master info structure
  8. 每日总结 - Android TextView文字底部或者中间 加横线
  9. 类-描述器-把类对象方法转变为属性方式
  10. [SDOI2009] HH去散步 (矩阵乘法)