• 在Java中,异常对象都是派生于Throwable类的一个实例,Java的异常体系如下图所示:

  所有的异常都是由Throwable继承而来,在下一层立即分解为两个分支,ErrorException

  • Error错误:描述了Java运行时系统的内部错误和资源耗尽错误。一般是指虚拟机相关的问题,如系统崩溃,虚拟机出错误等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常不处理。因为如果出现这样的内部错误,除了通告用户,并尽力使程序安全地终止之外,再也无能为力了。
  • Exception异常:Java的异常分为两种,checked Exception(编译时异常)和 RuntimeException(运行时异常)。
  1. checked Exception(编译时异常): Java认为checked Exception都是可以在编译阶段被处理的异常,一般是IOException和SQLException。所以它强制程序处理所有的checked Exception,而RuntimeException无须处理,java程序必须显式处理checked Exception,如果程序没有处理,则在编译时会发生错误,无法通过编译。用try{...}catch{...}finally{...}进行处理或throw和throws抛出异常。
  2. RuntimeException(运行时异常):这些异常一般是由程序逻辑错误引起的,一般都是程序员的错,表示程序存在bug,所以,一般不需要进行异常处理,直接让程序停止,由调用者对代码进行修正。常见的有NullPointException,IndexOutOfBoundsException(下标越界异常),ClassCastException,ArithmeticException(算数运算异常,例如除数为0等),ArrayStoreException (向数组中存放与声明类型不兼容对象异常),NegativeArraySizeException(创建一个大小为负数的数组错误异常),NumberFormatException(数字格式异常)等
    • 出现运行时异常后,系统会自动把异常一直往上层抛(不需要程序员在代码中抛出),一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
    • 如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。
  • Java异常处理方法有:抛出异常,捕捉异常。主要依赖于try、catch、finally、throw、throws五个关键字。

  1. try:它里面放置可能引发异常的代码

  2. catch:后面对应异常类型和一个代码块,用于表明该catch块用于处理这种类型的代码块,可以有多个catch块。

  3. finally:主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件),异常机制总是保证finally块总是被执行。只有finally块执行完成之后,才会回来执行try或者catch块中的return或throw语句,如果finally中使用了return或者 throw等终止方法的语句,则就不会跳回执行,直接停止。

  4. throw:用于抛出一个实际的异常,可以单独作为语句使用,抛出一个具体的异常对象。

  5. throws用在方法签名中,用于声明该方法可能抛出的异常
     import java.io.IOException;
    
     public class Test {
    
         public static void main(String[] args) {
    System.out.println("returning result is " + testException());
    } public static int testException(){
    int i = 1 ;
    try{
    throw new IOException() ;
    }catch(Exception e){
    System.out.println("catch it !");
    return i;
    }finally{
    i = 2 ;
    System.out.println("finally ok") ;
    System.out.println("i = " + i) ;
    //return i ;
    }
    }
    }

    当第20行的return语句注释掉时,输出的结果是

    catch it !
       finally ok
       i = 2
       returning result is 1      同时也表明如果try 或 catch 中有return语句,则在进入finally之前,Java的中间缓存变量机制已经将try 或 catch 中返回的结果进行了缓存,执行完finally中的语句后,直接将缓存结果return,而当finally中有return语句时,则直接return当前的结果即可。
     当第20行的return语句没有注释掉时,输出的结果是

    catch it !
       finally ok
       i = 2
       returning result is 2

Java基础——异常体系的更多相关文章

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

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

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

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

  3. JAVA基础——异常详解

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

  4. Java基础-异常、断言

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

  5. Java中异常体系

    Java中的异常体系 Throwable,是一个类,表示可抛出的,它是所有的异常都继承的类. Throwable的子类,又分为两种,一种是Error,另一种是Exception. Error一般不是应 ...

  6. java的异常体系 及强制转换

    一,异常 1.常见的几种异常: StackOverFlow  栈溢出错误:写递归函数的时候,没有定义递归结束的条件. ArrayIndexOutofBounds   数组越界:如新new一个数组,in ...

  7. Java基础 - 异常详解

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

  8. Java基础——异常

    一.什么是异常  异常的英文单词是exception,字面翻译就是“意外.例外”的意思,也就是非正常情况.事实上,异常本质上是程序上的错误,包括程序逻辑错误和系统错误.比如使用空的引用.数组下标越界. ...

  9. Java:异常体系

    异常的类别:可处理异常,运行时异常,非运行时异常 子类重写父类方法,父类方法有异常抛出, 子类重写父类的方法? 不能比父类抛出更大的异常 前言:java 中的异常处理机制你真的理解了吗?掌握了吗?ca ...

随机推荐

  1. virtual修饰符

    virtual(C# 参考) virtual 关键字用于修饰方法.属性.索引器或事件声明,并使它们可以在派生类中被重写. 例如,此方法可被任何继承它的类重写. public virtual doubl ...

  2. 黄聪:Discuz!的SEO优化策略二:如何去掉页脚多余的信息

    论坛搭建好,首先是把多余的东西都砍掉. 页脚的信息在我看来,都是很多余的信息,如下图: 要怎么消灭掉它们呢? 1.进入 全局 -- 站点信息 2.站点名称改为你的论坛名称,它会出现在内页的标题最末位. ...

  3. linux命令(7)killall

    killall命令: Linux系统中的killall命令用于杀死指定名字的进程(kill processes by name).我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀 ...

  4. ubuntu14.04 彻底重装mysql&phpmyadmin

    ---恢复内容开始--- 因为很久没用mysql,突然发现密码忘记了,折腾半天后,怎么也改不会来了!再此记一下,彻底重新删除再安装的过程. step1. 卸载: sudo apt-get remove ...

  5. android 列表开发 ListView

    1.android 端 二个entity consultInfo: private String name; private String id; consultInfoRef private iLi ...

  6. [ActionScript 3.0] AS3.0 获取文本的明暗度

    /** * 获取文字的明暗值 * @param t 文字 * @return Number */ function getDensity(t:String):Number { var ttf:Text ...

  7. [ActionScript 3.0] 通过三角形获得 3D 效果

    Flash Player 10 和更高版本,Adobe AIR 1.5 和更高版本 在 ActionScript 中,使用Graphics.drawTriangles()方法执行位图转换,因为 3D ...

  8. jquery中各个事件执行顺序如下:

    jquery中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.ajaxSuccess(全局事件) 6.e ...

  9. Delphi Alpha皮肤控件使用方法

    //用于刷新控件颜色. FsSkinManager.BeginUpdate; FsSkinManager.EndUpdate(True); //动态选择皮肤 begin if not FIsswitc ...

  10. [SQL]SQL Server数据表的基础知识与增查删改

    SQL Server数据表的基础知识与增查删改 由张晨辉(学生) 于19天 前发表 | 阅读94次 一.常用数据类型 .整型:bigint.int.smallint.tinyint .小数:decim ...