[学习笔记]Java异常机制
概述
异常
Java中的异常,就是对不正常情况进行描写叙述后的对象体现。
异常体系
- 当中Error类处理严重异常,一般不编写针对性的代码对其进行处理。
- Exception类处理非严重异常,能够使用针对性的处理方式进行处理。
异常类方法
- getMessage()
获取异常信息,返回字符串。 - toString()
获取异常类名和异常信息,返回字符串。 - printStackTrace()
获取异常类名和异常信息,以及异常出如今程序中的位置。直接打印,返回值void。 - printStackTrace(PrintStream s)
通经常使用该方法将异常内容保存在日志文件里,以便查阅。
特点
throw和throws的使用方法
- throw定义在方法内,用于产生异常对象。
- throws定义在方法上,用于抛出方法内产生的异常类,抛出多个异经常使用逗号隔开。
演示样例
class Div {int div(int a, int b) throws Exception // 必须对其的调用进行捕获或声明以便抛出{return a / b;}int MultiEx(int a, int b) throws ArithmeticException, ArrayIndexOutOfBoundsException {int c = a / b;int[] arr = new int[a];System.out.println(arr[a]);return c;}}public class ExceptionDemo {public static void main(String[] args) // throws Exception{Div d = new Div();try {int x = d.div(2, 0);System.out.println("x = " + x);} catch (Exception e) {System.out.println("异常! ");System.out.println(e.getMessage()); // 异常信息System.out.println(e.toString()); // 异常名称:异常信息e.printStackTrace(); // 异常名称:异常信息// 异常出现的位置}System.out.println("----------------");try {int x = d.MultiEx(4, 1);System.out.println("x = " + x);} catch (ArithmeticException e) {System.out.println("除数不能为0!");System.out.println(e.toString());} catch (ArrayIndexOutOfBoundsException e) {System.out.println("数组下标越界! ");System.out.println(e.toString());} catch (Exception e) {System.out.println(e.toString());}System.out.println("----------------");}}
执行结果
分层思想
try{throw new AException();}catch(AException e){throw e;}
或者异常能够处理,但须要将异常产生后和本功能相关的问题提供出去,抛出让调用者能够处理的异常和信息,也能够将捕获异常处理后转换新的异常抛出。
所以异常发生不一定抛出原来的异常,也能够在本层处理后抛出上一层能够接受的异常。
try{throw new AException();}catch(AException e){//对AException处理。throw new BException;}
异常处理方式
1. 捕捉
格式
有三种结合方式
- try{}catch(){}
- try{}catch(){}finally{}
- try{}finally{}
注意
- finally中定义的一般是关闭资源码,由于资源必须释放。
- 仅仅有在catch中使用了System.exit(0)方法时,不运行finally中的代码。
2. 抛出
3. 演示样例
class Demo1 {void func() throws Exception {// 异常处理:抛出throw new Exception();}}class Demo2 {void func() {// 异常处理:捕捉try {throw new Exception();} catch (Exception e) {}}}class Demo3 {void func() throws Exception {try {throw new Exception();} catch (Exception e) {// 捕捉异常。假设无法处理,能够继续抛出ethrow e;}}}class Demo4 {void func() {try {throw new Exception();} catch (Exception e1) {// 捕捉异常,假设无法处理。能够将异常e1转化成调用者可接受异常后抛出try {throw e1;} catch (Exception e2) {// 异常转换}}}}class Demo5 {void func() throws Exception {try {throw new Exception();} finally {// 关闭资源}}}
4. 多异常的处理
假设多个catch块中的异常出现继承关系,父类异常catch块放最后。
5. 异常分类
- 该异常在编译时,假设没有处理(没抛出也没捕捉)。编译失败。该异常被标识。表示能够被处理。
- 该异常必须进行异常处理(抛出或者捕捉)。
- 编译时,不须要处理,编译器不检查。
- 假设在函数内抛出该异常或其子类异常。函数上不须要声明。
假设在函数上抛出该异常或其子类异常,调用者也不须要处理。
由于这类异常一般无法正确继续程序。一旦出现,希望终止程序并由程序猿改动代码以解决该类异常。 - 自己定义异常发生时,假设该异常无法继续程序执行,就让其继承RuntimeException。
6. 异常处理原则
- 当函数内部有throw抛出异常对象,并未进行try处理。必须在函数上声明,否则编译失败。
RuntimeException及其子类除外。
- 假设函数声明了异常。调用者须要进行处理。处理方式有两种。即捕捉和抛出。
- 函数上声明异常。可以提高安全性。强制调用者进行处理。
- 调用到抛出异常的功能时。抛出几个,就处理几个。出现一个try相应多个catch。当中父类的catch放最以下。
自己定义异常
用法
class MyException extends Exception{MyException(String msg){super(msg);}}
自己定义异常的优点
自己定义异常在父子类方法重写中的情况
/** 自己定义异常继承体系* Exception* |--AException* | |--BException* |--CException*/class AException extends Exception {}class BException extends AException {}class CException extends Exception {}class Father {void func() throws AException {}}class Son extends Father {void func() throws BException {// 仅仅能抛出AException或者AException的子类BException,不能抛出CException// 假设子类产生新异常CException。这里仅仅能try,不能抛出。}}
自己定义异常演示样例
class NegativeException extends Exception {private int value;NegativeException(String msg) {super(msg);}NegativeException(String msg, int value) {super(msg);this.value = value;}int getValue() {return value;}}class Demo {int customExc(int x) throws NegativeException // 函数内手动抛出非执行时异常。必须对其进行捕捉或声明抛出。{if (x < 0) throw new NegativeException("负数!", x);return x;}int runtimeExc(int x) // 函数内手动抛出RuntimeException异常或其子类异常,不须要对其进行捕捉或声明抛出。{if (x == 0) throw new ArithmeticException("数值为0! ");return x;}void checkString(String s) {if (s.equals("String"))// 避免空指针异常,应改动为:// if("String".equals(s))System.out.println("PASS!");elseSystem.out.println("FAIL!");}}public class ExceptionCustom {public static void main(String[] args) // throws Exception{Demo d = new Demo();try {int x = d.customExc(-3);System.out.println("x = " + x);} catch (NegativeException e) {System.out.println(e.toString() + "\n该数为:" + e.getValue());}System.out.println("-------------------");d.runtimeExc(0); // 算术异常(执行时),停止程序,须要程序猿改动代码。System.out.println("-------------------");d.checkString("String");d.checkString(null); // 空指针异常(执行时)。System.out.println("-------------------");}}
自己定义异常实例
// 员工使用电脑案例/*** 电脑死机异常*/class CrashException extends Exception {CrashException(String msg) {super(msg);}}/*** 电脑烧毁异常*/class BurnException extends Exception {BurnException(String msg) {super(msg);}}/*** 无法工作异常*/class WorkException extends Exception {WorkException(String msg) {super(msg);}}class Computer {// 电脑状态,0电脑正常。1电脑死机。2电脑烧毁private int state = 0;public void run() throws CrashException, BurnException {if (state == 1) throw new CrashException("电脑崩溃了!");if (state == 2) throw new BurnException("电脑烧毁了!");System.out.println("电脑执行...");}public void reboot() {System.out.println("电脑重新启动...");state = 0;}public void setState(int state) {this.state = state;}}abstract class Employee {private String name;Employee(String name) {this.name = name;}abstract void work() throws WorkException;}class Staff extends Employee {private Computer com;Staff(String name) {super(name);com = new Computer();}public void work() throws WorkException {try {com.run();} catch (CrashException e) {// 假设电脑死机了。则重新启动电脑就可以System.out.println(e.toString());com.reboot();} catch (BurnException e) {// 假设电脑烧毁了。则向上级报告。抛出无法工作异常请求放假。throw new WorkException("无法继续工作!\n原因:" + e.toString());}System.out.println("工作!");}public void computerStateChange(int state) {com.setState(state);}}public class ExceptionCase {public static void main(String[] args) {Staff s = new Staff("Jacob");// 分别针对不同的电脑状态,模拟工作情况for (int i = 0; i < 3; i++) {System.out.println("------------------情况" + i + ":------------------");// 更改员工电脑的状态s.computerStateChange(i);// 员工工作try {s.work();} catch (WorkException e) {System.out.println(e.toString() + "\n放假! ");}}}}
执行结果
[学习笔记]Java异常机制的更多相关文章
- [Java学习笔记] Java异常机制(也许是全网最独特视角)
Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...
- Java编程思想学习笔记_4(异常机制,容器)
一.finally语句注意的细节: 当涉及到break和continue语句的时候,finally字句也会得到执行. public class Test7 { public static void m ...
- 1.13(java学习笔记)异常机制
异常不同于错误,它是程序运行时产生的未知问题. 如果把程序比喻成一辆汽车,那么汽车开着开着突然前面出现了一个大石头挡住了路,这就叫异常. 那么出现了这个异常我们需要去处理,比如打电话给公路管理局,让它 ...
- Java学习笔记__异常机制_try_catch_finally_return执行顺序
package cn.xiaocangtian.Exception; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...
- java学习笔记09--反射机制
java学习笔记09--反射机制 什么是反射: 反射是java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取他所有的成员变量和方法并且显示出来 ...
- [java学习笔记]java语言核心----面向对象之this关键字
一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理: 代表的是当前对象. this就是所在函数 ...
- [java学习笔记]java语言核心----面向对象之构造函数
1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用: 给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...
- 全面理解java异常机制
在理想状态下,程序会按照我们预想的步骤一步一步的执行,但是即使你是大V,你也不可避免出错,所以java为我们提供了异常机制.本文将会从以下几个方面介绍java中的异常机制: 异常机制的层次结构 异常的 ...
- Java 异常机制
Java 异常机制 什么是异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程 为什么要有异常 什么出错了 哪里出错了 ...
随机推荐
- 【LeetCode】Binary Tree Inorder Traversal(二叉树的中序遍历)
这道题是LeetCode里的第94道题. 题目要求: 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单 ...
- 2017"百度之星"程序设计大赛 - 复赛
Arithmetic of Bomb Accepts: 1050 Submissions: 1762 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- log4net配置分析
appender 附加器 RollingFileAppender 滚动文件appender MaxSizeRollBackups 最大尺寸回滚 ConversionPatter ...
- kb-01-d<poj3279>--深搜变种,二进制优化;
poj--3279 题意: 给n*m的矩阵,0 1组成,每次翻转一个格子可以将上下左右的五个节点翻转,求,把所有的格子翻转成0:输出每个个字的翻转次数:最少字数: 做法: 从上到下,第一行翻转的情况确 ...
- bzoj1306: [CQOI2009]match循环赛(模拟爆搜)
Input第一行包含一个正整数n,队伍的个数.第二行包含n个非负整数,即每支队伍的得分.Output输出仅一行,即可能的分数表数目.保证至少存在一个可能的分数表.Sample Input 6 5 6 ...
- 如何应对pm2.5
细颗粒物又称细粒.细颗粒.PM2.5:指环境空气中空气动力学当量直径小于等于 2.5 微米的颗粒物,也称细颗粒物.能较长时间悬浮于空气中,其在空气中含量(浓度)越高,就代表空气污染越严重.可吸入颗粒物 ...
- C# ORM框架
SQLSUGAR http://www.codeisbug.com/Doc/8/1159 附带mysql工具类,最优使用上面sqlsugar using System; using System.Co ...
- ubuntu通过cifs-utils访问Windows共享目录
ubuntu旧一点的版本如:12.0x是用smbclient访问window共享的,但比较新的版本如:16.04是通过cifs-utils访问Windows共享目录 同样道理先安装: apt-get ...
- bzoj 3203 凸包+三分
题目大意 具体自己看吧link 读入n,D,表示n关 大概就是第i关有i只僵尸排成一队来打出题人 最前面那只是编号为\(i\)的僵尸,最后面的一只是编号为\(1\)的僵尸 最前面的僵尸离出题人\(X_ ...
- 编写webconfig连接串与使用(新)
原文发布时间为:2008-07-27 -- 来源于本人的百度文章 [由搬家工具导入] webconfig 中<appSettings/> 得后面代码添加如下: <appSetting ...