# java201904010 **Repository Path**: GUOSD/java201904010 ## Basic Information - **Project Name**: java201904010 - **Description**: 异常 - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-04-14 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # java201904010 #### 介绍 异常 #### 笔记 1. 异常概念 1.1 错误和异常 程序在编译执行之前,已经剔除了语法错误,但是在程序执行过程中还可能会发生一些意想不到的情况; 这些程序执行中发生意外情况有两种:错误和异常; 错误:发生错误时,程序会终止;错误是没有办法处理的; 在java中,所有的错误类都是以Error结尾的; 异常:发生异常时,程序会进行异常信息提示,并且异常经过处理之后可以不影响程序性的正常执行; 在java中,所有的异常处理类都是以Exception结尾; java中的错误类和异常都是继承自Throwable类;是Throwable的子类; 1.2 异常的分类 根据异常处理的时机(时间)分为: 运行时异常; 程序在运行时才会发生异常,编译时不需要对异常进行显式处理,所以,又叫做非检查性异常; 编译时异常;又叫做非运行时异常; 程序在编译的时候进行对异常进行显式的检查处理,如果没有进行异常处理,则编译时会发生编译语法错误,也就是,编译时异常如果不进行显式处理,则编译报错,不能通过编译; 所以,又叫做 检查性异常; 根据异常编译时是否需要显式检查处理分为: 检查性异常; 编译时需要先对异常进行显式的处理,否则编译不能通过,会出现编译的语法错误,所有,又叫做 编译时异常(非运行时异常) 非检查性异常; 编译时不需要对异常进行显示处理,编译时不进行异常检查,可以直接编译通过,但是在运行时可能会发生异常,又叫做,运行时异常; 2.异常处理 2.1 异常处理 异常处理主要是针对需要进行显式处理的异常类型进行处理。 主要针对编译时异常(非运行时异常、检查性异常)进行处理;(不得不处理) 当然,运行异常(非检查性异常)一般不需要进行显式的异常处理,通过编码的逻辑思维的缜密性来保证程序的正常运行; 运行时异常(非检查性异常)也可以进行显式的异常处理;(以防万一) 2.2 try-catch-finally异常处理机制 语法: try{ // 可能发生异常的代码块 }catch(可能发生的异常类型 异常变量名){ // 进行异常处理 注意:发生的异常信息都从异常类型的变量中获取 }catch(可能发生的异常类型n 异常变量名n){ // 进行异常处理 注意:发生的异常信息都从异常类型的变量中获取 }finally{ // 进行异常处理的收尾操作(可有可无,可选的) } 解析: (1)执行try中的语句块; (2)如果try中的语句块发生了异常,则从发生异常的位置直接跳转到catch中进行处理,注意,try中发生异常位置之后的代码则不会再被执行; (3)如果发生了异常,执行catch部分的异常处理代码块; (4)catch部分执行完成之后,如果有finally部分,则继续执行finally部分,否则顺序执行后面其他的代码; 注意: try-catch必须有,不可以省略,finally部分是可选的; 如果有finally部分,则无论是否发生异常,finally部分都会被执行; catch部分语句块至少有一个,可以有多个catch部分,表示可以处理多种类型的异常; 如果有多个catch部分,则catch部分的异常类型从前往后需要按照从小到大的顺序排列;(异常类的大小关系根据异常类之间的父子继承关系确定) 或者,多个catch部分的异常类型的范围是子类在前面,父类在后面; 多个catch之间具有互斥性,发生异常之后只有一个catch进行处理; 多个catch还可以写成如下形式:(jdk7+支持) catch(异常类型1|异常类型2|异常类型3 e) 注意: 异常类型1和异常类型2之间不能有父类的包含关系; 也就是|前后的异常类型不能是父子类的包含关系; 补充: 含有finally的子方法在被调用时finally语句块是最后被执行的; 如果子方法中含有finally语句块,即使try或者catch中的return语句即使被执行了,也不会立即返回上层主方法,而是要等finally语句块执行完之后,才会返回上层主方法; 2.3 throws 异常处理机制 throws处理机制是在方法声明时可以使用throw将该方法体中可能出现的异常信息向上层调用者进行抛出,交由上层调用者进行处理; 当然,上层调用者,还可以选择继续向上抛出异常,指导main方法,main方法可以继续向jvm抛出,最终有jvm进行处理; 注意,如果主方法调用的子方法采用了throw方式的异常处理机制,该主方法可以选择使用try-catch进行处理,也可以选择继续向上层throw处理; 如果需要抛出多个异常,则使用逗号分隔即可,没有其他限定; 3.throw手动抛出异常 除了程序自己抛出的异常之外,还可以使用throw关键字手动触发一个异常; 语法: throw new 异常类(); 解析: 通过throw抛出一个创建的异常对象; 注意: 手动抛出的异常一般要采用throws抛给上层调用者去进行处理; 一般不采用try-catch的处理方式; 目的: 通过子方法抛出异常交由上层主方法进行处理,达到一种子方法和上层调用者之间的一种通信机制; 课堂练习: 教材P10左下角的代码运行分析一下。 4、自定义异常类 自定义异常类的开发:继承父类Exception类或者其他异常类,通过多态重写的方式开发自定义异常类; #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 码云特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)