异常
什么是异常?
异常是指程序在运行过程中所发生的不正常事件,它会中断正在运行的程序。
传统方式来处理异常-----修改代码
异常解决了哪些问题?
代码臃肿
花很大时间堵住的漏洞
但是很难赌完所有的漏洞
Java中的异常都是Exception
于是 需要使用异常处理机制
什么是异常处理?
Java编程语言使用异常处理机制为程序提供了处理错误的能力
程序中预先设置好对付异常的处理办法,对异常进行处理
Java中的异常处理是通过5个关键字来实现的
捕获异常
try 执行可能产生异常的代码
catch 捕获异常
fianlly 无论是否发生异常 必须执行的代码
声明异常
throws 声明方法可能要抛出的各种异常
抛出异常
throw 手动抛出异常
try-catch代码块
1.正常情况下 无异常
try{
//代码段
}catch(异常类型 变量名){
//对异常进行处理的代码块
}
执行顺序:try--catch 后的代码
2.出现异常 并且恰好和catch后的异常相匹配
try{
//代码段
//产生异常的代码段2
//代码段3
}catch(异常类型 变量名){
//对异常进行处理的代码块
}
执行顺序:try--catch内的语句--catch外的语句
3.出现异常 并且异常不匹配
try{
//代码段
//产生异常的代码块2
//代码段3
}catch(异常类型 变量名){
//对异常进行处理的代码块
}
执行顺序:try --中断
异常是一种特殊的对象,类型为 java.lang.Exception 或其子类
异常的堆栈信息
printStackTruce()的堆栈跟踪功能显示出程序运行到当前类的执行流程
异常堆栈信息由下往上看,找错由上往下
在catch中处理异常
加入用户自定义处理信息
System.out.print("错误提示")
调用方法输出异常信息
变量名.printStachTrace();
异常对象常用的方法
void.printStachTrace();//输出异常的堆栈信息
String getMessage()//但会异常信息描述字符串 是printStachTrace()输出信息的一部分
常见的异常类型
Exception 异常层次结构的父类
ArithmeticException 算数错误情形 如以0作除数
ArrayIndexOutOfBoundsException 数组下标越界
NullPointerException 尝试访问num对象成员 空指针异常
ClassNotFoundException 找不到加载所需的类
IIIegalArgumentException 方法接受到非法参数
ClassCastException 对象强制类型转换出错
NumberFormatException 数字格式转换异常
try--catch--finally
在try-catch块后加入finally
不论是否发生异常都会执行
唯一情况:如果加了System.exit(1); 则中断程序 退出JVM
finally
public void method(){
try{
//代码块1
//产生异常的代码块2
}catch(异常类型 ex){
//对异常进行处理的代码块
return;
}finally{
//代码段4
}
}
问?return 情况下 finally是否执行?
执行顺序:try-发生异常-产生异常对象-catch-处理异常-finally块-return
try-catch-finally中 try是必须的 catch 与 finally 缺一不可 但两者至少有一个
多重catch块
引发多种类型的异常
排列catch语句的顺序,先子类后父类
发生异常时按顺序匹配
只执行第一个与异常类型匹配的catch
声明异常
如果在一个方法中抛出了异常,如何通知调用者?
throws声明的某个方法,可能抛出的异常
多个异常用逗号隔开
方式1:调用者处理异常
方式2:调用者继续抛出异常 main方法抛出的异常由JVM处理
抛出异常
除了系统自动抛出异常之外,有哪些问题需要程序员自行抛出异常?
使用throw 抛出异常
throw和throws的区别
1.作用不同:throw用于程序员自行产生并抛出了异常
throws用于声明该方法内抛出了异常
2.使用的位置不同:throw位于方法体的内部,可单独使用
throws必须跟在方法参数列表后 不可单独使用
3.内容不同:throw抛出一个异常对象,只能跟一个
throws 后面跟异常类,可以跟多个
异常体系结构
自定义异常
当jdk中的异常类型不能满足程序的需要时,可以自行定义异常
使用自定义异常类型步骤
1.定义异常类 继承异常父类 编写构造方法实现父类方法
2.实例化自定义异常对象,将其抛出
异常处理原则
异常处理与性能
异常只能用于非正常情况
不要将过于庞大的代码块放在try中
在catch中指定具体的异常类型
需要对捕捉的异常作处理