最近开始了找工作的面试,在面试过程中,面试官问了关于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. javaScript运算符学习笔记

    1.赋值运算符 javaScript运算符可以分为简单赋值和复合赋值运算.简单赋值运算是将赋值运算符(=)右边的表达式的值保存到赋值运算符左边的变量中,复合赋值运算则是混合了其他操作(算术运算操作,位 ...

  2. [剑指Offer] 27.字符串的排列

    [思路]从第一位开始,判断每一位字符的所有可能性,依此递归. class Solution { public: void PermutationHelp(vector<string> &a ...

  3. Spring 集成Quartz

    在使用jdk的timer时发现无法在指定的日期进行执行任务.这便引入一个优秀的开源任务调度框架“quartz”.这里使用的是quartz-1.8.6版本.Quart的官网:http://www.qua ...

  4. background 背景图铺满界面

    background <body background="/image/1.png" style=" background-repeat:no-repeat ; b ...

  5. BZOJ4551 Tjoi2016&Heoi2016树(离线+并查集)

    似乎是弱化的qtree3.树剖什么的非常无脑.考虑离线.并查集维护每个点的最近打标记祖先,倒序处理,删除标记时将其与父亲合并即可. #include<iostream> #include& ...

  6. javascript prototype原型链的原理

    javascript prototype原型链的原理 说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: <script type="text/javasc ...

  7. ARC074 E RGB Sequence DP

    ---题面--- 题解: 首先,有一个不太直观的状态,f[i][j][k][l]表示DP到i位,三种颜色最后出现的位置分别是j, k, l的方案数.因为知道了三种颜色最后出现的位置,因此也可以得知以当 ...

  8. CF#366 704D Captain America 上下界网络流

    CF上的题,就不放链接了,打开太慢,直接上题面吧: 平面上有n个点, 第 i 个点的坐标为 ($X_i ,Y_i$), 你需要把每个点染成红色或者蓝色, 染成红色的花费为 r , 染成蓝色的花费为 b ...

  9. GDB使用小记

    By francis_hao Nov 7,2016   记录GDB常用功能.   GDB可以让你查看一个程序在运行时其内部发生了什么,或者当一个程序崩溃时发生了什么(通过使用GDB查看core dum ...

  10. taotao用户注册前台页面

    注册页面效果: 注册jsp: <%@ page language="java" contentType="text/html; charset=UTF-8" ...