异常处理
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Error
Error 是 Throwable 的子类,表示仅靠程序本 仅靠程序本 身无法恢复的严重错误[比如内存溢出动态链接 身无法恢复的严重错误 比如内存溢出动态链接 失败,虚拟机错误 虚拟机错误],应用程序不应该抛出这种类 失败 虚拟机错误 应用程序不应该抛出这种类 型的错误(一般虚拟机抛出 一般虚拟机抛出)假如出现这种错误 型的错误 一般虚拟机抛出 假如出现这种错误 除了是程序尽力退出之外也无能为力,用于指 除了是程序尽力退出之外也无能为力 示合理的应用程序不应该试图捕获的严重问题 。 在执行该方法期间,无需在方法中通过throws 声明可能抛出但没有捕获的 Error 的任何子类 ,因为Java编译器不去检查它,也就是说,当 当 程序中可能出现这类异常时, 程序中可能出现这类异常时,即使没有用 try...catch语句捕获它,也没有用 语句捕获它, 语句捕获它 也没有用throws字 字 句声明抛出它,还是会编译通过。 句声明抛出它,还是会编译通过
ifelse处理异常缺点 处理异常缺点
异常处理是程序设计中一个非常重要的方面,也是程 序设计的一大难点,从C开始,你也许已经知道如何用 如何用 if...else...来控制异常了,也许是自发的,然而这种 来控制异常了, 来控制异常了 也许是自发的, 控制异常痛苦, 控制异常痛苦,同一个异常或者错误如果多个地方出 现,那么你每个地方都要做相同处理,感觉相当的麻 那么你每个地方都要做相同处理, 代码臃肿,程序不健壮 影响开发效率,影响代码可读 烦[代码臃肿 程序不健壮 影响开发效率 影响代码可读 代码臃肿 程序不健壮,影响开发效率 性]! Java语言在设计的当初就考虑到这些问题,提出异常 处理的框架的方案,所有的异常都可以用一个类型来 表示,不同类型的异常对应不同的子类异常 这里的异 不同类型的异常对应不同的子类异常(这里的异 不同类型的异常对应不同的子类异常 常包括错误概念),定义异常处理的规范,在1.4版本以 常包括错误概念 后增加了异常链机制,从而便于跟踪异常!这是Java语 言设计者的高明之处,也是Java语言中的一个难点, 下面是我对Java异常知识的一个总结,也算是资源回 收一下。
catch语句可以有多个 语句可以有多个,用来匹配多个异 语句可以有多个 常[但前提是必须从子类到父类],匹配上 多个中一个后,执行 执行catch语句块时候仅 执行 语句块时候仅 仅执行匹配上的异常。catch的类型是 仅执行匹配上的异常 Java语言中定义的或者程序员自己定义 的,表示代码抛出异常的类型,异常的 异常的 变量名表示抛出异常的对象的引用,如 变量名表示抛出异常的对象的引用 果catch捕获并匹配上了该异常,那么就 可以直接用这个异常变量名,此时该异 该异 常变量名指向所匹配的异常,并且在 常变量名指向所匹配的异常 catch代码块中可以直接引用。这一点非 常非常的特殊和重要!
什么是异常
异常就是在程序运行过程中所发生的不 在程序运行过程中所发生的不 正常事件,比如所需的文件找不到,网络连 正常事件 接不同或中断,算数出错[如被零除],数组 下标越界,装载不存在的类,对null对象操 作,类型转换异常等,异常会中断正在执行 的程序。
基础知识
异常是程序中的一些错误, 异常是程序中的一些错误,但并不是所有的 错误都是异常,并且错误有时候是可以避免的 错误都是异常 。比如说,你的代码少了一个分号,那么运行 代码少了一个分号, 代码少了一个分号 出来结果是提示是错误ng.Error;如果 出来结果是提示是错误 你用System.out.println(11/0),那么你是因 , 为你用0做了除数 做了除数, 为你用 做了除数,会抛出 ng.ArithmeticException的异常 的异常。有 的异常 些异常需要做处理,有些则不需要捕获处理, 后面会详细讲到。 天有不测风云,人有旦夕祸福,Java的程 序代码也如此。在编程过程中,首先应当尽可 应当尽可 能去避免错误和异常发生,对于不可避免、 能去避免错误和异常发生,对于不可避免、不 可预测的情况则在考虑异常发生时如何处理。 可预测的情况则在考虑异常发生时如何处理 异常处理可以让写的代码更健壮和易于维护。 异常处理可以让写的代码更健壮和易于维护
基础知识
try{ 程序代码 }catch(异常类型1 异常的变量名1){ 程序代码 }catch(异常类型2 异常的变量名2){ 程序代码 System.exit(1);//finally不执行的唯一情况 return;//finally语句仍旧会执行 }finally{ 程序代码 }
基础知识关于catch关键字 关键字 基础知识关于
基础知识
Java中的异常用对象来表示。Java对异常的处理是按 异常分类处理的,不同异常有不同的分类,每种异常 每种异常 都对应一个类型(class),每个异常都对应一个异常 类 都对应一个类型 ,每个异常都对应一个异常(类 对象。 的)对象 对象 异常类从哪里来?有两个来源,一是Java语言本身 定义的一些基本异常类型,二是用户通过继承 通过继承 Exception类或者其子类自己定义的异常 类或者其子类自己定义的异常。Exception 类或者其子类自己定义的异常 类及其子类是 Throwable 的一种形式,它指出了合理 的应用程序想要捕获的条件。 异常的对象从哪里来呢?有两个来源,一是Java运 行时环境自动抛出系统生成的异常,而不管你是否愿 意捕获和处理,它总要被抛出!比如除数为0的异常。 二是程序员自己抛出的异常,这个异常可以是程序员 自己定义的,也可以是Java语言中定义的,用throw 关键字抛出异常, 关键字抛出异常,这种异常常用来向调用者汇报异常 的一些信息。 的一些信息
多重catch块的实例 块的实例 多重
public static void divide1()throws MyException{ try{ int c=1/0; }catch(ArithmeticException e){ System.out.println("除数为0"); e.printStackTrace(); throw new MyException(); }catch(Exception e){ e.printStackTrace(); throw new MyException(); }}
异常处理的目的
Java异常处理的目的是提高程序的健壮 提高程序的健壮 性,你可以在catch和finally代码块中给 程序一个修正机会,使得程序不因异常 而终止或者流程发生以外的改变。同时 ,通过获取Java异常信息,也为程序的 开发维护提供了方便,一般通过异常信 息就很快就能找到出现异常的问题(代码) 所在。 Java异常处理是Java语言的一大特色 ,也是个难点,掌握异常处理可以让写 更健壮和易于维护。 的代码更健壮和易于维护 更健壮和易于维护
Throwable
Throwable 类是 Java 语言中所有错误或异常 所有错误或异常 的超类。只有当对象是此类(或其子类之一)的 的超类 实例时,才能通过 Java 虚拟机[main()方法声 方法声 明的异常将由java虚拟机来处理 虚拟机来处理]或者 Java 明的异常将由 虚拟机来处理 throw 语句 类的方法 语句[类的方法 类的方法]抛出。类似地,只有此 类或其子类之一才可以是 catch 子句中的参数 类型。 两个子类的实例,Error 和 Exception,通常 用于指示发生了异常情况。通常,这些实例是 在异常情况的上下文中新近创建的,因此包含 了相关的信息(比如堆栈跟踪数据 堆栈跟踪数据 printStackTrace()打印堆栈信息 打印堆栈信息)。 打印堆栈信息
RuntimeException
RuntimeException 是那些可能在 Java 那些可能在 虚拟机正常运行期间抛出的异常的超类[ 虚拟机正常运行期间抛出的异常的超类 不要求程序必须对它们做出异常]。Java 不要求程序必须对它们做出异常 编译器不去检查它,也就是说,当程序 中可能出现这类异常时,即使没有用 try...catch语句捕获它,也没有用 throws字句声明抛出它,还是会编译通 过,这种异常可以通过改进代码实现来 这种异常可以通过改进代码实现来 避免。 避免
基础知识
异常是针对方法来说的,抛出、声明抛出、捕 异常是针对方法来说的 获和处理异常都是在方法中进行的。 Java异常处理通过5个关键字 个关键字try、catch、 个关键字 、 、 throw、throws、finally进行管理 进行管理。基本过程 、 、 进行管理 是用try语句块包住要监视的语句 语句块包住要监视的语句,如果在try 用 语句块包住要监视的语句 语句块内出现异常,则异常会被抛出,你的代 码在catch语句块中可以捕获到这个异常并做 在 语句块中可以捕获到这个异常并做 处理;还有以部分系统生成的异常在Java运行 处理 时自动抛出。你也可以通过 也可以通过throws关键字在方 也可以通过 关键字在方 法上声明该方法要抛出异常,然后在方法内部 法上声明该方法要抛出异常, 通过throw抛出异常对象 抛出异常对象。finally语句块会在 通过 抛出异常对象 方法执行return之前执行,一般结构如下:
பைடு நூலகம்
两个catch块不能换位置 块不能换位置,catch块的排列顺序 两个 块不能换位置 排列顺序 必须从子类到父类. 必须从子类到父类
基础知识关于finally关键字 关键字 基础知识关于
finally语句在任何情况下都必须执行的代码 语句在任何情况下都必须执行的代码, 语句在任何情况下都必须执行的代码 这样可以保证一些在任何情况下都必须执行代 码的可靠性。比如,在数据库查询异常的时候 ,应该释放JDBC连接等等。finally语句先于 语句先于 return语句执行 语句执行,而不论其先后位置,也不管 语句执行 是否try块出现异常。finally语句唯一不被执 语句唯一不被执 行的情况是方法执行了System.exit()方法 方法。 行的情况是方法执行了 方法 System.exit()的作用是终止当前正在运行的 的作用是终止当前正在运行的 Java 虚拟机 虚拟机。finally语句块中不能通过给变 量赋新值来改变return的返回值,也建议不要 在finally块中使用return语句,没有意义还容 易导致错误。
Exception
Exception 类及其子类是 Throwable 的 一种形式,它指出了合理的应用程序想 要捕获的条件,表示程序本身可以处理 程序本身可以处理 的异常[由 的异常 由java应用程序抛出和处理的非 应用程序抛出和处理的非 严重错误比如所需文件找不到等]它的各 严重错误比如所需文件找不到等 它的各 种不同的子类分别对应不同类型的异常 。
异常处理
if..else..处理异常 处理异常
if(input.hasNextInt()){//检验输入的被除数是否为整数 num1=input.nextInt(); }else{//如果输入的被除数不是整数err是输出错误信息 是输出错误信息 System.err.println("输入的被除数不是整数,程序退出"); System.exit(1); 退出应用程序即退出虚拟机 退出应用程序即退出虚拟机} System.out.println("请输入除数"); int num2=0; if(input.hasNextInt()){//检验输入的被除数是否为整数 num2=input.nextInt(); if(0==num2){ System.err.println("输入的除数为0,程序退出"); System.exit(1); } }else{//如果输入的被除数不是整数 System.err.println("输入的被除数不是整数,程序退出"); System.exit(1); }