最近开始了找工作的面试,在面试过程中,面试官问了关于Java当中的异常处理机制,一直以来,无论写代码还是看书,自己对异常处理这一块就没有很好的重视过,对它的认知也仅仅停留在通过Try-catch去进行捕获的层面,被面试官这么一问,自己瞬间懵逼了起来,特地在此总结一下java的异常处理机制。

  java把异常当做对象来处理,并且定义了一个所有异常的父类,即java.lang.Throwable类,而继承了这个Throwable类的子类分为了两种,也就是我们常说的Error(错误)和Exception(异常)。

  Error:表示的是程序在运行期间出现了非常严重的错误,并且这种错误是不可恢复的,由于这属于JVM层次的严重错误,所以通常Error会导致程序的终结,常见的Error包括了OutofMemoryError、ThreadDeath等。Btw:Error也属于unchecked异常。

  Exception表示可恢复的异常,是编译器可以捕获到的,它大体可以分为两种类型:checked exception(检查异常)和runtime exception(运行时异常)。

  checked exception(检查异常):常见的检查异常包括了SQL异常、IO异常、这种异常都是发生在JAVA编译的阶段,编译器会强制程序去捕获此类异常,并且将可能会出现这样异常的代码放到Try块中去,对异常的处理放到Catch块中。

  runtime exception(运行时异常):对于运行时异常,编译器并没有强制对其进行捕获和处理,如果不对这种异常进行处理,则当出现这样的异常的时候,将会交由JVM去处理。常见的运行时异常包括:NullPointException,ClassCastException、ArrayIndexOutOfBoundsException、BufferOverFlowException等、出现运行时异常后,系统会一直把异常向上层抛出,知道遇到处理代码为止、若没有处理块,则就会到最上层(单线程为main函数、多线程为Thread.run()方法抛出)后,程序将会停止。

  那么在什么情况下,我们应该在方法的声明的过程当中,就声明要抛出的异常呢?比如:

public void test(String 123) throws IOException
{ }

  在什么时候需要方法中抛出throws子句声明异常,什么样的异常必须使用throws子句声明?

  一个方法必须声明所有可能抛出的受查异常(check excepiton)(在不使用try-catch去捕获的情况下),而非受查异常要么不可控制,要么就应该避免发生(runtimeException),如果方法没有声明所有受查异常,那么编译器可能会发出一个错误提示。当然,除了声明异常之外,还可以捕获异常,这样会使异常不被跑到方法之外,也不需要throws子句声明。

  那么这就涉及到了另一个问题,在什么样的情况下,应该对异常进行捕获处理,在什么样的情况下,应该对异常进行抛出向上传递呢?

  本人的理解是,当前方法有对该异常进行处理的能力和必要的时候,就通过try-catch代码块去将异常捕获和处理,当前方法对异常没有处理的能力或者处理的必要的时候,则将该异常直接交给能够胜任的处理上层在对异常进行捕获和处理,具体情况要具体讨论,并没有一个统一的处理标准。

  在这里还要提示一个点,就是在捕获异常的顺序当中,需要先捕获子类,再捕获父类,否则捕获子类的代码将永远不会被运行。

  到这里异常的部分就总结完毕了。

Java基础:异常机制的更多相关文章

  1. Java基础——异常机制

    [捕获异常] 硬件的错误.输入错误.物理限制等问题,都可能导致程序运行时的异常出现. 1.异常的分类层次 在java中,异常对象都是由Throwable类继承而来的,主要分为两大类: Error和Ex ...

  2. Java的异常机制

    Java的异常机制 (一)异常的概念 异常是指程序在编译或运行时出现的导致程序不能继续编译或运行的状况.. (二)Throwable类 Throwable类继承自Object类,是Java中所有错误或 ...

  3. Java基础-类加载机制与自定义类Java类加载器(ClassLoader)

    Java基础-类加载机制与自定义类Java类加载器(ClassLoader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于类加载器的概念和分类我就不再废话了,因为我在之前的笔 ...

  4. Java基础-异常(Exception)处理

    Java基础-异常(Exception)处理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.异常的概述 什么是异常?Java代码在运行时期发生的问题就是异常.在Java中,把异 ...

  5. 关于java中异常机制

    什么是异常:异常就是程序在运行时出现的不正常情况.对于严重的情况Java通过Error类进行描述,一般不用编写代码处理:对于不严重的情况Java通过Exception描述,一般编写针对性代码对其进行处 ...

  6. 《Java基础——异常的捕获与抛出》

    Java基础--异常的捕获与抛出     '  前言: Error类(错误)和Exception类(异常)是Throwable类的子类. 异常分为CheckedException类(编译时异常)和Ru ...

  7. Java基础 - 异常详解

    异常的层次结构 Throwable Throwable 是 Java 语言中所有错误与异常的超类. Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示 ...

  8. Java基础——异常体系

    在Java中,异常对象都是派生于Throwable类的一个实例,Java的异常体系如下图所示: 所有的异常都是由Throwable继承而来,在下一层立即分解为两个分支,Error和Exception. ...

  9. JAVA基础——异常详解

    JAVA异常与异常处理详解 一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1 ...

  10. Java基础-异常、断言

    处理错误 如果Java程序运行期间出现了错误,并且由于出现错误导致某些操作没有完成,程序应该能够返回到一种安全状态,并能够让用户执行一些其他的命令:或者允许用户保存所有操作结果,并以妥善的方式终止程序 ...

随机推荐

  1. iOS-数据持久化之Sqllite

    iOS中的数据存储方式 Plist(NSArray\NSDictionary) Preference(偏好设置\NSUserDefaults) NSCoding(NSKeyedArchiver\NSk ...

  2. 【bzoj2783】[JLOI2012]树 树上倍增

    题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.节点1是根节点,根的深度是0,它的儿子节点的深度为1.路径不必一 ...

  3. hdu6103 Kirinriki(trick+字符串)

    题解: 考虑一开始时,左边从1开始枚举,右边从n开始枚举 我们可以得到一个最大的值k. 但是如果这样依次枚举,复杂度肯定是n^3,是不行的 考虑如何利用上一次的结果,如果我们把1和n同时去掉 就可以利 ...

  4. 雅礼集训 Day3 T3 w 解题报告

    w 题目背景 \(\frac 14\)遇到了一道水题,双完全不会做,于是去请教小\(\text{D}\).小\(\text{D}\)看了\(0.607^2\)眼就切掉了这题,嘲讽了\(\frac 14 ...

  5. 通过init-connect + binlog 实现MySQL审计功能

    背景: 假设这么一个情况,你是某公司mysql-DBA,某日突然公司数据库中的所有被人为删了. 尽管有数据备份,但是因服务停止而造成的损失上千万,现在公司需要查出那个做删除操作的人. 但是拥有数据库操 ...

  6. spring中@PropertySource注解的使用

    概述: The @PropertySource annotation provides a convenient and declarative mechanism for adding aPrope ...

  7. 7月16号day8总结

    今天学习过程和小结 1.列举Linux常用命令 shutdown now Linux关机 rebot重启 mkdir mkdir -p递归创建 vi/touth filename rm -r file ...

  8. 通过AWS的DHCP自动获取的IP地址是否会发生改变?

    针对您的问题,分析如下:1.在一个VPC内,通过AWS的DHCP自动获取的IP地址,在如何情况下会发生改变?例如我把vpc的内所有100个ec2实例全部关闭,再全部重新打开,是否会发生IP地址变化的情 ...

  9. 如何实现用户id生成一个唯一邀请码

    #如何实现用户id生成一个唯一邀请码 #创建验证码 function createCode($user_id) { static $source_string = 'E5FCDG3HQA4B1NOPI ...

  10. linux基础(2)

    Linux基础题 作业一:1) 新建用户natasha,uid为1000,gid为555,备注信息为“master”useradd natashagroupmod -g 555 natashauser ...