异常
1.生活中的异常
在了解程序的异常之前先了解一下生活中的异常什么情况?
假设我们每天开车去上班,从出发到抵达大概需要半小时,但万一发生了意外,睡过头了,或者路上堵车,那么必然会导致迟到,无法达到预期的目的,出现了不平常的状况,就是异常发生了。
2.程序中的异常
程序中报错的提示
ArrayIndexOutOfBoundsException 数组越界异常
ClassCastException 类型转换异常
ClassNotFoundException 类找不到异常
NullPointerException 空指针异常 NPE
…
假如我写一个计算除法的代码
int result = 0;
Scanner input = new Scanner(System.in);
syso{"输入被除数"}
int num1 = int.nextInt();
syso{"输入除数"}
int num2 = int.nextInt();
result = num1/num2;
syso{num1+"/"+num2+"="+result}
如果我不按照数据类型int来输入数字,而是输入字符串类型,那么程序一定会报错,而异常就是指在程序运行过程中发生不正常事件时,它会中断正在运行的程序。
3.Java中的异常处理
Java语言提供了五个关键字来为程序提供处理错误能力
try
、catch
、finally
、throw
、throws
3.1-try-catch块捕获异常
try{
// 可能出现异常问题的代码断
}catch(捕获的异常类型 名){
// 对异常进行处理的代码断
}
添加了异常处理机制后,程序会分为以下三种情况:
1.程序正常运行
,没有异常
正常执行try中的try-catch后的代码,不会执行catch中的代码。
2.出现了对应
的异常
执行try代码时,如果出现了异常,try中的代码不会再往下执行,JVM会立刻创建对应的异常对象(new XXXException)
,在catch块中可以被声明的异常抓获(前提是能抓住
)然后就可以执行异常处理代码,最后正常执行之后的代码。
3.出现了不对应
的代码
catch中的异常类型不匹配,则无法传入,也就无法进行异常处理,程序中断(和没有添加异常处理一个效果
)
3.2-多重catch块捕获异常
try{
// 可能出现异常的代码段
}catch(异常类型1){
// 对应处理代码
}catch(异常类型2){
// 对应处理代码
}catch(){
.....
}
类似于多重if,只要满足其中一个异常类型,剩下的异常捕获不会执行。
多重catch块主要运用在:需要对不同的异常进行不同处理操作时,需要用到多重catch。
3.3-try-catch-finally
加入了finally
后,finally
中的代码,无论程序是否异常都会执行。
当finally
和return
同时出现时,会先执行finally
中的代码再去执行return
。
4.抛出异常
除了系统自动抛出异常外,有些问题需要程序员自己抛出异常,使用throw
关键字抛出。
5.异常的体系结构
ThorwableError
(程序无法修复 必须人工修改)
Exception
(可通过代码/程序进行动态修复的)
Checked
(受检异常:编写出来就提示你进行解决)
Runtime
(运行时异常:代码执行过程中出现的异常,有时候不需要修复,
inputMismatchException
ArthimaticException
ArraylndexOutOfBoudsExcePtion
…
都属于运行时异常
6.log4j(log for Java)
6.1-为什么使用log4j?
- 如何实现以文件形式记录
异常信息
以及程序正常运行关键步骤信息
? - 使用开源日志记录工具—
log4j
来实现
6.2-日志分类
- SQL日志
- 异常日志
- 业务日志
6.3-什么是 log4j?
log4j
是apache
实现的一个开源日志组件
6.4-如何使用log4j记录日志?
1.导包 将jar包变成小奶瓶
2.配置log4j 通过log4j.properties 放在src目录下
3.使用API进行日志记录
Logger logger = Logger.getLogger(字节码对象:类名.class);
logger.info();
logger.error();
logger.debug();
- 使用步骤
1.在项目下新建一个lib文件夹
2.在lib文件夹下拷贝好log4j的jar包
3.将jar包添加到项目的类库中
什么是jar包?
jar包就是别人将自己写好的类进行打包,上传到开源社区,你可以将这些jar包引入你自己的项目中,然后就可以使用jar包中的类和属性了,一般都会将这些jar包放在自己新建的lib目录下