[学习笔记]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 异常机制 什么是异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程 为什么要有异常 什么出错了 哪里出错了 ...
随机推荐
- [python学习篇][廖雪峰][1]高级特性--创建生成器 方法1 a = (x for x in range(1,3))
创建一个生成器的方法: for x in range(1,10000000) ,先生成一个列表[1........9999999] 如果我们只想要后面的几个元素,会发现浪费很多空间.所以,如果列表元素 ...
- AtCoder Petrozavodsk Contest 001
第一场apc,5H的持久战,我当然水几个题就睡了 A - Two Integers Time limit : 2sec / Memory limit : 256MB Score : 100 point ...
- linux下java命令行引用jar包
一般情况下: 如果java 文件和jar 包在同一目录 poi-3.0-alpha3-20061212.jar testTwo.java 编译: javac -cp poi-3.0-alpha3-2 ...
- php默认有最大执行时间
执行php默认有最大执行时间,默认30s,修改,不能设置’1h’,貌似单位不能修改
- BZOJ4598 [Sdoi2016]模式字符串 【点分治 + hash】
题目 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m 的模式串s,其中每一位仍然是A到z的大写字母.Alice希望知道,有多少对结点< ...
- hosts文件位置
windows C:\WINDOWS\system32\drivers\etc mac /etc/hosts 修改hosts文件会遇到无法保存的问题,解法方法参考下文 http://mtoou.inf ...
- 算法复习——状压dp
状压dp的核心在于,当我们不能通过表现单一的对象的状态来达到dp的最优子结构和无后效性原则时,我们可能保存多个元素的有关信息··这时候利用2进制的01来表示每个元素相关状态并将其压缩成2进制数就可以达 ...
- 一款多功能的移动端滚动选择器,支持单选到多选、支持多级级联、提供自定义回调函数、提供update函数二次渲染、重定位函数、兼容pc端拖拽等等..
https://github.com/onlyhom/mobileSelect.js/blob/master/docs/README-CN.md mobileSelect.js 一款多功能的移动端滚动 ...
- Beyond compare vs kdiff3
這裡使用的 kdiff3 版本是 0.9.98 基於以下 三點,最終選擇了 beyond compare 1. kdiff3 不能刪檔案, 以下為例,不能刪1 2. kdiff3 ...
- postgresql 10 ltree 使用说明
官方文档 https://www.postgresql.org/docs/10/static/ltree.html ltree是俄罗斯Teodor Sigaev和Oleg Bartunov共同开发的P ...