生活中的异常:和正常状态下的事件格格不入的场景,我们称之为异常
计算机中的异常:正常情况下代码不会出现的场景
计算机中什么是异常处理
如果代码出现与正常情况下相悖的场景,需要用代码去进行异常处理
1.try-catch-正常
try{代码(存放希望被执行的代码,这里的代码可能有异常,可能没有异常)
}catch(异常的类型 异常名称变量(一般为e)){异常处理的具体细节(捕获异常)
}
2.try-catch-异常
try{代码(存放希望被执行的代码,这里的代码可能有异常,可能没有异常)
}catch(异常的类型 异常名称变量(一般为e)){异常处理的具体细节(捕获异常)
}catch(异常的类型 异常名称变量(一般为e1)){异常处理的具体细节(捕获异常1)
}
如果代码中同时出现多个可能出现异常的场景,只会捕获一次异常,也就是说只执行一次catch模块分支,并且捕获的顺序是由上至下
一般捕获遵循的规则是上小下大
如果只捕获小的,不捕获大的(Exception)会导致异常类捕获不完整
如果只捕获大的,不捕获小的会导致捕获异常无法具体定位
如果捕获的顺序不合理,比如上大下小,由于代码的执行顺序是由上至下所以会导致只捕获大的异常,之后的具体的小的异常不在捕获,原因是异常只捕获一次
3.try-catch-不匹配
如果没有捕获的到对应的异常则try catch失效
4.常见的异常类型
Exception异常层次结构的父类
ArithmeticException算术错误情形,如以零作除数
ArrayIndexOutOfBoundsException数组下表越界
NullPointerException尝试访问null对象成员
ClassNotFoundException不能加载所需的类
IllegalArgumentException方法接收到非法参数
ClassCastException对象强制类型转换出错
NumberFormatException数字格式转换异常,如把abc转换成数字
5.try-catch-finally-exit
finally会在程序正常或是程序异常的情况下都执行,做补充,但是有一个特例,就是在catch中加入System.exit(0)的行为,中断虚拟机,退出程序,则不执行finally语句
6.try-catch-finally-return
先执行finally后执行return
异常
1.声明异常
public static void show()throws Exception{
}提示用户这个代码可能有异常,也可能没有异常
public static void main (String[]args)throws Excception{
Demo demo =new Demo()
demo.show(); 调用异常的第一种方式
}
public static void main(String[]args){
Demo demo=new Demo();
try{demo.show();
}catch (Exception e){
e.printStackTrace();
}调用异常的第二种方式
}
2.抛出异常(人为抛出异常)
if (sex.equals("男"))||sex.equals("女"){
不是男就是女
}else{
throw new Exception(“不是人”)
}throws 是系统声明有异常;throw是人为抛出的异常。
3.异常的分类
1.错误error 定义:无法用代码解决的异常(没法通过改代码解决问题)
2.异常Exception定义:可以用代码去捕获(解决)
3.exception分两类 检查时异常 运行时异常
检查时异常(checked Exception)定义 代码运行前(编译时)必须处理
运行时异常(runtime Exception)定义 代码编译时不强制性处理
4.log4j
1.log4j
定义:开源日志记录
功能:实现以“文件”形式记录异常信息,程序正常运行的关键信息
步骤:先new一个新的项目project,在项目中new一个directory名称命名为lib,将log4j复制粘贴至lib中,将log4j解压(耳机上面的选项),在src中新建类;private static Logger logger=Logger.getlogger(类名.class.getName());导包一定要找到log4j,很容易倒错包
在每个输出和异常后面加入logger.debug("输出")
log4j是用来阅读日志的
只输出控制台
删除log4j.properties中的logfile
只输出到文件
删除log4j.properties中的stdout
修改输出的时间格式
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-mm-dd HH:mm:ss}%1 %F %P %m%n
计算机能自动识别是年月日时分秒
日志文件名称
log4j.appender.logfile.File=my.log my.log可以修改
日志的级别顺序
debug<info<warn<error
日志只能识别级别等级等于或高于它的,无法识别等级比自己低的