-
异常概述
- Exception及Error的概念、区别
- 异常:指程序运行时发生的不正常事件;异常能够被异常机制处理,保证程序继续运行下去;例如:除数为零、文件没有找到、输入数字格式不对。
- 错误:指示合理的应用程序不应该试图捕获的严重问题。错误不能被程序处理。发生错误后jvm一般会终止程序运行。解决需要我们修改源代码例如:内存泄漏
- Exception及Error的概念、区别
-
Exception的层次关系
-
API中标准异常的继承树关系
- API标准异常的顶级父类 Throwable类; //注意是类哦
- Throwable类有两个子类:Exception和Error;所有异常都是Exception类的直接或间接子类;所有错误都是Error的直接或间接子类;
-
运行时异常与非运行时异常的区别
- Exception分类
- 运行时异常:
- RuntimeException的子类都是运行时异常,其他都是非运行时异常。
- 也称非检测性异常,这些异常在编译器不检测,程序可选择处理与否。但是如果不处理运行时会中断。编译不会出问题。
- 非运行时异常
- 也称检测性异常,必须进行处理,不处理,会发生编译期错误
- 运行时异常:
- Exception分类
-
常见运行时异常的概念(空指针、数学、格式、造型)
-
RuntimeException的子类都是运行时异常
-
NullPointerException–空指针异常
- 发生条件:当一个空对象,即没有初始化,依然为null的对象调用属性或方法时
- 这个异常一般不捕获。
-
ArithmeticException-算术异常
- 发生条件:整数除以0
-
IndexOutOfBoundException-索引越界异常
-
包括StringIndexOutOfBoundException
和ArrayIndexOutOfBoundException
-
发生条件:访问字符串或数组元素,超过长度时。
-
-
NumberFormatException-数字格式异常
- 发生条件:将把一个字符串转换为数字,而字符串内容不是数字时。
-
ClassCastException-类型转换异常
- 发生条件:把父类对象转换为不相关的子类类型时。
-
-
非运行时异常在编译器检测的特性
- 编译期会被检测,并强制要求处理这类异常,不处理就会报错
- 常见非运行时异常:IOException 、SQLExeption
-
-
异常处理流程及语句
-
Java异常处理的标准流程
抛出异常-运行时异常JVM自行抛出,非运行时异常使用throw抛出 捕获异常-catch语句捕获 捕获成功-catch的异常类型与抛出的异常类型匹配 异常被处理,程序继续运行 (捕获失败-catch的异常不匹配 程序中断执行)
-
try代码块
- 放置所有可能抛出异常或肯定抛出异常的代码
-
catch语句
-
用于捕获异常,匹配就运行catch中语句
-
可能发生3中情况
- 发生异常并捕获成功
- 发生异常捕获失败
- 未发生异常
-
catch语句一般写:
- 任意对异常处理的代码
- 调用异常对象的方法,例如printStackTrace
-
对于多个异常要做相同处理的时候
- 可以使用|
try { int num=s.nextInt(); System.out.println(num); //throw new ClassCastException("人为创造的一个类型转换异常"); System.out.println(19/0); }catch (ArithmeticException|ClassCastException e) { e.printStackTrace(); }finally { s.close(); } //这里表示对于算术异常和类型转换异常我们做的是同一个处理
-
-
多个catch
- 可能抛出多种类型异常时使用
- 注意:Catch语句的异常类型必须从子类到父类的顺序,否则编译失败。(因为异常只要被成功捕获一次,被处理后,就不会继续抛出了)
-
finally块
- 希望不管什么情况,都要执行的代码卸载finally块。
-
catch及finally的可选特性
-
finally与return
- 前面有return 仍然执行
- 前面有System.exit(0) 不被执行
-
throw与throws
-
抛出异常:创建一个异常对象,然后使用throw关键字交给异常处理机制去处理;
-
使用方式:
throw 异常对象; 例如 throw new Exception(); 或 catch(Exception e){ throw e; }
-
对于运行时异常,JVM自行执行一条抛出语句
throw new ArithmeticException();
-
运行时异常JVM自行抛出,非运行时异常需要程序员throw抛出;//在我们觉得异常应该被处理的地方抛出异常
然后根据流程我们有两种方式:
-
try/catch/finally进行处理
-
不处理,使用throws声明异常
-
注意:如果调用第一种方式,异常在try/catch块中就被处理,我们不能再捕获到这个异常了。
所以我们通常使用第二种方式进行声明,这样会很灵活。
-
-
-
throws:位于方法声明处,声明方法中可能发生的异常。
- 使用throws,当我们调用方法时,编译器会提醒我们要处理这些异常,否则就会编译错误。
-
-
-
自定义异常
- 自定义异常的意义
- 为了不与API中的标准异常混淆
- 当我们需要根据业务需求定义业务异常
- 自定义异常声明和使用
- 实现方式:继承API中任意一个标准异常类
- 通常继承Exception类
- 一般自定义异常类不写其他方法,只重载必要的构造方法
- 因为构造方法不会被子类继承。
- 自定义异常的意义
-
断言
- 断言的作用
- 断言的使用
-
运行时异常和非运行时异常的区别为什么运行时异常使用多。
-
try/catch/finally 可以嵌套在try块、catch块、finally块。
-
抛出异常与 try/catch块的区别
- 抛出异常:一般
-
异常堆栈:异常从内到外抛,方法从外向里调。
Java异常处理机制
最新推荐文章于 2022-12-06 20:17:54 发布