MODULE 7 Exceptions
----------------------------
程序正常执行过程中遇到的意外情况
引发异常的因素:
1)程序本身的内在因素
2)外部因素引发的,程序无须关注
例:数组访问越界异常; 除以0;
异常发生:
1)会在发生的位置抛出异常
2)程序的正常流程会发生改变
3)对于抛出的异常需要进行捕获处理
try {
//正常的程序执行流程
}catch(异常1){
//异常1的处理代码
}catch(异常2){
//异常2的处理代码
}finally{
//无论是否出现异常,都要去执行的
}
注意:
当捕获多个异常是,且这些异常之间存在父子关系,一定要先捕获子异常,再捕获父异常(因为异常的捕获是顺序进行的)
try{
//
}catch(IOException e)){ //小异常
//deal with IOException
}catch(Exception e){ //大异常
//deal wwith Exception
}
练习:DivTest.java
方法:div(int i,int j){} //实现i/j,并打印输出结果
main:调用div()方法,测试
异常的传播栈
-------------------------
1)异常会在发生的位置一级级向它的上层调用者抛出
2)在抛出的传播路径上,任何一个点上都可以捕获处理该异常
3)一旦异常被捕获,则它的上层调用者不再受到影响,但若不处理,最终会抛给JVM,导致程序意外终止
异常的常用方法:
1)getMessage() 获取该异常的简单描述信息,返回的是字符串
2)printStackTrace() 打印出异常完整的传播路径
练习:DivTest1.java
main --> div1() --> div2() --> div3() --> div()
常见异常
1.java.lang.ArithmeticException 算数异常 除以0时
2.NullPointerException 空指针异常
Student s;
s.display();
对一个空对象进行操作
3.ArrayIndexoutofBoundsException
异常的体系结构
--------------------
Object --> Throwable -->
1.Error
无视程序本身的错误,而是外部因素引发的,程序直接终止。(如系统崩溃,内存不足等)
2.Exception
java中所有的异常类都继承自该类,程序可以进行处理的那些异常
1)RuntimeException 又叫 unchecked exception
属于程序无法自我恢复的异常,用try/catch处理无意义,往往是程序的逻辑错误引起的,应尽量避免这类异常的发生
2)非RuntimeException 又叫 checked exception
程序中必须要try/catch处理的异常
从RuntimeException继承的异常都为unchecked
从Exception或RuntimeException之外的异常继承的异常都是checked
练习:
自定义异常类,Account银行账户存款/取款,
原有的:
当金额非法是,返回0;
改造的:
提示用户金额非法,并告知账户余额和操作金额
Assertion断言
----------------------------
通过简单的参数设置,控制程序中的调试语句生效或失效
应用:
程序中用于临时调试的代码,希望系统发布时控制这些代码失效,而在调试时是代码生效
关键字:assert
用法:
assert 布尔表达式;
assert 布尔表达式:字符串
判断布尔表达式:
结果为true时,程序继续往下执行
结果为false时,抛出java.lang.AssertionError异常,提示信息就是布尔表达式后面的字符串
运行时通过参数控制程序中的断言:
java -ea AssertionTest