概述

异常

程序在执行时出现的不正常情况,是对问题的描写叙述。将问题进行对象的封装。

Java中的异常,就是对不正常情况进行描写叙述后的对象体现。


异常体系

Throwable
    |--Error
    |--Exception
          |--RuntimeException
  • 当中Error类处理严重异常,一般不编写针对性的代码对其进行处理。
  • Exception类处理非严重异常,能够使用针对性的处理方式进行处理。

不管Error或者Excption都具有一些共同的属性和方法,比方不正常情况的信息和引发原因等。


异常类方法


  • getMessage()

    获取异常信息,返回字符串。

  • toString()

    获取异常类名和异常信息,返回字符串。
  • printStackTrace()

    获取异常类名和异常信息,以及异常出如今程序中的位置。直接打印,返回值void。
  • printStackTrace(PrintStream s)

    通经常使用该方法将异常内容保存在日志文件里,以便查阅。

特点

异常体系中全部的类以及建立的对象都具有可抛性,也就是说能够被throw和throwskeyword操作,仅仅有异常体系具备这个特点。


throw和throws的使用方法

  • throw定义在方法内,用于产生异常对象。

  • throws定义在方法上,用于抛出方法内产生的异常类,抛出多个异经常使用逗号隔开。

演示样例

  1. class Div {
  2. int div(int a, int b) throws Exception // 必须对其的调用进行捕获或声明以便抛出
  3. {
  4. return a / b;
  5. }
  6.  
  7. int MultiEx(int a, int b) throws ArithmeticException, ArrayIndexOutOfBoundsException {
  8. int c = a / b;
  9. int[] arr = new int[a];
  10. System.out.println(arr[a]);
  11. return c;
  12. }
  13. }
  14.  
  15. public class ExceptionDemo {
  16. public static void main(String[] args) // throws Exception
  17. {
  18. Div d = new Div();
  19. try {
  20. int x = d.div(2, 0);
  21. System.out.println("x = " + x);
  22. } catch (Exception e) {
  23. System.out.println("异常!
  24. ");
  25. System.out.println(e.getMessage()); // 异常信息
  26. System.out.println(e.toString()); // 异常名称:异常信息
  27. e.printStackTrace(); // 异常名称:异常信息
  28. // 异常出现的位置
  29. }
  30. System.out.println("----------------");
  31. try {
  32. int x = d.MultiEx(4, 1);
  33. System.out.println("x = " + x);
  34. } catch (ArithmeticException e) {
  35. System.out.println("除数不能为0!");
  36. System.out.println(e.toString());
  37. } catch (ArrayIndexOutOfBoundsException e) {
  38. System.out.println("数组下标越界!
  39. ");
  40. System.out.println(e.toString());
  41. } catch (Exception e) {
  42. System.out.println(e.toString());
  43. }
  44. System.out.println("----------------");
  45. }
  46. }
  47.  

执行结果

异常!

/ by zero
java.lang.ArithmeticException : / by zero
java.lang.ArithmeticException : / by zero
     at Div.div(ExceptionDemo.java:4)
     at ExceptionDemo.main(ExceptionDemo.java:21)
----------------
数组下标越界。
java.lang.ArrayIndexOutOfBoundsException : 4
----------------

分层思想

当捕获到异常,本功能处理不了时。能够继续在catch中抛出。
  1. try
  2. {
  3. throw new AException();
  4. }
  5. catch(AException e)
  6. {
  7. throw e;
  8. }
  9.  
假设该异常处理不了。但并不属于该功能出现的异常。为了进行模块式开发,减少耦合性,能够将异常转换后,再抛出和该功能相关的异常。

或者异常能够处理,但须要将异常产生后和本功能相关的问题提供出去,抛出让调用者能够处理的异常和信息,也能够将捕获异常处理后转换新的异常抛出。

所以异常发生不一定抛出原来的异常,也能够在本层处理后抛出上一层能够接受的异常。

  1. try
  2. {
  3. throw new AException();
  4. }
  5. catch(AException e)
  6. {
  7. //对AException处理。
  8. throw new BException;
  9. }
  10.  

异常处理方式

1. 捕捉

格式

try{
     须要被检測的代码
}
catch(异常类 变量){
     对捕获到的异常进行处理。异常对象的常见操作:String getMessage()获取异常信息等。
     一定要定义详细的处理方法,不要简单一句e.printStackTrace(),也不要简单一句输出语句。一般使用错误日志进行保存。

}
finally{
     定义一定运行的代码。通经常使用于关闭资源。
}

有三种结合方式

  • try{}catch(){}
  • try{}catch(){}finally{}
  • try{}finally{}

注意

  • finally中定义的一般是关闭资源码,由于资源必须释放。
  • 仅仅有在catch中使用了System.exit(0)方法时,不运行finally中的代码。


2. 抛出

使用throwskeyword将产生的异常抛出。交由调用者处理。

3. 演示样例

  1. class Demo1 {
  2. void func() throws Exception {
  3. // 异常处理:抛出
  4. throw new Exception();
  5. }
  6. }
  7.  
  8. class Demo2 {
  9. void func() {
  10. // 异常处理:捕捉
  11. try {
  12. throw new Exception();
  13. } catch (Exception e) {}
  14. }
  15. }
  16.  
  17. class Demo3 {
  18. void func() throws Exception {
  19. try {
  20. throw new Exception();
  21. } catch (Exception e) {
  22. // 捕捉异常。假设无法处理,能够继续抛出e
  23. throw e;
  24. }
  25. }
  26. }
  27.  
  28. class Demo4 {
  29. void func() {
  30. try {
  31. throw new Exception();
  32. } catch (Exception e1) {
  33. // 捕捉异常,假设无法处理。能够将异常e1转化成调用者可接受异常后抛出
  34. try {
  35. throw e1;
  36. } catch (Exception e2) {
  37. // 异常转换
  38. }
  39.  
  40. }
  41. }
  42. }
  43.  
  44. class Demo5 {
  45. void func() throws Exception {
  46. try {
  47. throw new Exception();
  48. } finally {
  49. // 关闭资源
  50. }
  51. }
  52. }
  53.  

4. 多异常的处理

1. 声明异常时。建议声明更为详细的异常。这样处理能够做到更详细。

2. 声明几个异常。就相应有几个catch块,不要定义多余的catch块。

假设多个catch块中的异常出现继承关系,父类异常catch块放最后。


5. 异常分类

1. 编译时被检測异常(Exception类)
  • 该异常在编译时,假设没有处理(没抛出也没捕捉)。编译失败。该异常被标识。表示能够被处理。

  • 该异常必须进行异常处理(抛出或者捕捉)。
2. 执行时异常(编译时不检測。RuntimeException类)
  • 编译时,不须要处理,编译器不检查。
  • 假设在函数内抛出该异常或其子类异常。函数上不须要声明。

    假设在函数上抛出该异常或其子类异常,调用者也不须要处理。

    由于这类异常一般无法正确继续程序。一旦出现,希望终止程序并由程序猿改动代码以解决该类异常。
  • 自己定义异常发生时,假设该异常无法继续程序执行,就让其继承RuntimeException。

6. 异常处理原则

  • 当函数内部有throw抛出异常对象,并未进行try处理。必须在函数上声明,否则编译失败。

    RuntimeException及其子类除外。

  • 假设函数声明了异常。调用者须要进行处理。处理方式有两种。即捕捉和抛出。
  • 函数上声明异常。可以提高安全性。强制调用者进行处理。
  • 调用到抛出异常的功能时。抛出几个,就处理几个。出现一个try相应多个catch。当中父类的catch放最以下。


自己定义异常

依照Java的面向对象思想。将程序中出现的特有问题进行封装。

用法

定义继承Exception或者RuntimeException的异常类
1. 为了让该自己定义类具有可抛性。

2. 让该类具备操作异常的共性方法。

3. 当要定义自己定义异常信息时,能够使用父类已经定义好的功能,异常信息传递给父类的构造函数。

  1. class MyException extends Exception
  2. {
  3. MyException(String msg)
  4. {
  5. super(msg);
  6. }
  7. }
  8.  

自己定义异常的优点

1. 将问题进行封装。
2. 将正常流程代码和问题处理代码相分离,方便阅读。

自己定义异常在父子类方法重写中的情况

1. 子类在重写父类时。假设父类的方法抛出异常,那么子类的重写方法,仅仅能抛出父类的异常或者该异常的子类。

2. 假设父类方法抛出多异常,那么子类的重写方法。仅仅能抛出父类异常的子集。

3. 假设父类或者接口方法中没有异常抛出。那么子类在重写方法时,也不能够抛出异常。假设子类方法发生异常,仅仅能在方法内部进行捕捉处理。

演示样例
  1. /*
  2. * 自己定义异常继承体系
  3. * Exception
  4. * |--AException
  5. * | |--BException
  6. * |--CException
  7. */
  8. class AException extends Exception {}
  9.  
  10. class BException extends AException {}
  11.  
  12. class CException extends Exception {}
  13.  
  14. class Father {
  15. void func() throws AException {}
  16. }
  17.  
  18. class Son extends Father {
  19. void func() throws BException {
  20. // 仅仅能抛出AException或者AException的子类BException,不能抛出CException
  21. // 假设子类产生新异常CException。这里仅仅能try,不能抛出。
  22. }
  23. }
  24.  

自己定义异常演示样例

  1. class NegativeException extends Exception {
  2.  
  3. private int value;
  4.  
  5. NegativeException(String msg) {
  6. super(msg);
  7. }
  8.  
  9. NegativeException(String msg, int value) {
  10. super(msg);
  11. this.value = value;
  12. }
  13.  
  14. int getValue() {
  15. return value;
  16. }
  17. }
  18.  
  19. class Demo {
  20. int customExc(int x) throws NegativeException // 函数内手动抛出非执行时异常。必须对其进行捕捉或声明抛出。
  21. {
  22. if (x < 0) throw new NegativeException("负数!", x);
  23. return x;
  24. }
  25.  
  26. int runtimeExc(int x) // 函数内手动抛出RuntimeException异常或其子类异常,不须要对其进行捕捉或声明抛出。
  27. {
  28. if (x == 0) throw new ArithmeticException("数值为0!
  29. ");
  30. return x;
  31. }
  32.  
  33. void checkString(String s) {
  34. if (s.equals("String"))
  35. // 避免空指针异常,应改动为:
  36. // if("String".equals(s))
  37. System.out.println("PASS!");
  38. else
  39. System.out.println("FAIL!");
  40. }
  41. }
  42.  
  43. public class ExceptionCustom {
  44. public static void main(String[] args) // throws Exception
  45. {
  46. Demo d = new Demo();
  47.  
  48. try {
  49. int x = d.customExc(-3);
  50. System.out.println("x = " + x);
  51. } catch (NegativeException e) {
  52. System.out.println(e.toString() + "\n该数为:" + e.getValue());
  53. }
  54. System.out.println("-------------------");
  55. d.runtimeExc(0); // 算术异常(执行时),停止程序,须要程序猿改动代码。
  56. System.out.println("-------------------");
  57. d.checkString("String");
  58. d.checkString(null); // 空指针异常(执行时)。
  59. System.out.println("-------------------");
  60. }
  61. }
  62.  

自己定义异常实例

  1. // 员工使用电脑案例
  2. /**
  3. * 电脑死机异常
  4. */
  5. class CrashException extends Exception {
  6. CrashException(String msg) {
  7. super(msg);
  8. }
  9. }
  10.  
  11. /**
  12. * 电脑烧毁异常
  13. */
  14. class BurnException extends Exception {
  15. BurnException(String msg) {
  16. super(msg);
  17. }
  18. }
  19.  
  20. /**
  21. * 无法工作异常
  22. */
  23. class WorkException extends Exception {
  24. WorkException(String msg) {
  25. super(msg);
  26. }
  27. }
  28.  
  29. class Computer {
  30. // 电脑状态,0电脑正常。1电脑死机。2电脑烧毁
  31. private int state = 0;
  32.  
  33. public void run() throws CrashException, BurnException {
  34. if (state == 1) throw new CrashException("电脑崩溃了!");
  35. if (state == 2) throw new BurnException("电脑烧毁了!");
  36. System.out.println("电脑执行...");
  37. }
  38.  
  39. public void reboot() {
  40. System.out.println("电脑重新启动...");
  41. state = 0;
  42. }
  43.  
  44. public void setState(int state) {
  45. this.state = state;
  46. }
  47. }
  48.  
  49. abstract class Employee {
  50. private String name;
  51.  
  52. Employee(String name) {
  53. this.name = name;
  54. }
  55.  
  56. abstract void work() throws WorkException;}
  57.  
  58. class Staff extends Employee {
  59. private Computer com;
  60.  
  61. Staff(String name) {
  62. super(name);
  63. com = new Computer();
  64. }
  65.  
  66. public void work() throws WorkException {
  67. try {
  68. com.run();
  69. } catch (CrashException e) {
  70. // 假设电脑死机了。则重新启动电脑就可以
  71. System.out.println(e.toString());
  72. com.reboot();
  73. } catch (BurnException e) {
  74. // 假设电脑烧毁了。则向上级报告。抛出无法工作异常请求放假。
  75. throw new WorkException("无法继续工作!\n原因:" + e.toString());
  76. }
  77. System.out.println("工作!");
  78. }
  79.  
  80. public void computerStateChange(int state) {
  81. com.setState(state);
  82. }
  83. }
  84.  
  85. public class ExceptionCase {
  86. public static void main(String[] args) {
  87. Staff s = new Staff("Jacob");
  88. // 分别针对不同的电脑状态,模拟工作情况
  89. for (int i = 0; i < 3; i++) {
  90. System.out.println("------------------情况" + i + ":------------------");
  91. // 更改员工电脑的状态
  92. s.computerStateChange(i);
  93. // 员工工作
  94. try {
  95. s.work();
  96. } catch (WorkException e) {
  97. System.out.println(e.toString() + "\n放假!
  98. ");
  99. }
  100. }
  101. }
  102. }
  103.  

执行结果

------------------情况0:------------------
电脑执行...
工作!
------------------情况1:------------------
CrashException: 电脑崩溃了。
电脑重新启动...
工作。
------------------情况2:------------------
WorkException: 无法继续工作!
原因:BurnException: 电脑烧毁了!
放假。

[学习笔记]Java异常机制的更多相关文章

  1. [Java学习笔记] Java异常机制(也许是全网最独特视角)

    Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...

  2. Java编程思想学习笔记_4(异常机制,容器)

    一.finally语句注意的细节: 当涉及到break和continue语句的时候,finally字句也会得到执行. public class Test7 { public static void m ...

  3. 1.13(java学习笔记)异常机制

    异常不同于错误,它是程序运行时产生的未知问题. 如果把程序比喻成一辆汽车,那么汽车开着开着突然前面出现了一个大石头挡住了路,这就叫异常. 那么出现了这个异常我们需要去处理,比如打电话给公路管理局,让它 ...

  4. Java学习笔记__异常机制_try_catch_finally_return执行顺序

    package cn.xiaocangtian.Exception; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...

  5. java学习笔记09--反射机制

    java学习笔记09--反射机制 什么是反射: 反射是java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取他所有的成员变量和方法并且显示出来 ...

  6. [java学习笔记]java语言核心----面向对象之this关键字

    一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理:         代表的是当前对象.         this就是所在函数 ...

  7. [java学习笔记]java语言核心----面向对象之构造函数

    1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用:                给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...

  8. 全面理解java异常机制

    在理想状态下,程序会按照我们预想的步骤一步一步的执行,但是即使你是大V,你也不可避免出错,所以java为我们提供了异常机制.本文将会从以下几个方面介绍java中的异常机制: 异常机制的层次结构 异常的 ...

  9. Java 异常机制

    Java 异常机制 什么是异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程 为什么要有异常 什么出错了 哪里出错了 ...

随机推荐

  1. oracle主键设置与oracle序列

    第一步:添加主键(如果已有且是自己命名的可略过) 一个表中要有主键,我们建主键的时候要自己命名,如果不是可能在后边遇到“主键唯一,不能自动添加”的问题. 设置主键: alter table " ...

  2. iOS学习笔记49-Swift(九)访问控制

    一.Swift的访问控制 Swift中的访问控制模型基于模块和源文件这两个概念 模块指的是Framework或App bundle.在Swift中,可以用import关键字引入自己的工程. 源文件指的 ...

  3. jquery工具方法总结

    $.extend 对象合并,支持深拷贝 $.each 相当于array.each或object.each,可以遍历数组和对象 $.grep 相当于array.filter $.map 相当于array ...

  4. 刷题总结——松鼠的新家(bzoj3631)

    题目: Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上. ...

  5. java面试题之如何判断一个对象是否应该被回收

    常用的有两种办法: 引用计数法:(无法解决对象循环引用的问题,导致对象无法被回收) 可达性分析:

  6. python中的 __xxx__ 方法

    1 __class__ instance.__class__ The class to which a class instance belongs def foo(): pass class A(o ...

  7. element-ui复合型输入框的显示问题

    按照官方文档那样发现,最左边的选择器里面的字显示不出来,解决方法是在为el-select设置宽度,就可以正常显示了

  8. 相关分析 BZOJ 4821

    相关分析 [问题描述] Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等.Frank不仅喜欢观测,还喜欢分析观测到的数据.他 ...

  9. JAVA课程设计---多源教学数据管理系统

    1.团队课程设计博客链接 https://www.cnblogs.com/hq9-/p/10278470.html 2.个人负责模块或任务说明 (1)到控制台实现GUI界面中浏览文件并选取文件的功能. ...

  10. for循环创建对象

    有时候奇怪的发现往list添加数据的时候,一直被最后一个元素覆盖,首先 ,我们得明白原理: 在new 一个对象的时候,对象的ID是唯一确定的:将对象add入list中时,放入list中的其实是对象的引 ...