- 什么是异常
异常就是在程序运行过程中所发生的不正常事件;(异常会中断正在运行的程序)
- 常见异常
文件丢失 网络中断 算数运算出错 数组下标越界 装载不存在的类 对空对象操作 类型转换异常
- 什么是异常处理
在程序执行代码的时候,万一发生了异常,程序会按照预定的处理方法对异常进行处理,异常处理完毕后,
程序继续运行
- 使用if-else处理异常的机制特点
- 代码臃肿
- 影响开发效率
- 难以列举其他异常
- 可读性差,维护强度弱
- Java的异常处理
Java的异常处理用五个关键字来实现:try catch finally throw throws
- try catch 块
- 首先执行try块中的语句,如果try块中所有语句正常执行完毕,不会发生异常,那么catch块中的所有语句都将会被忽略
- 首先执行try块中的语句,如果try块在执行过程中遇到异常,并且这个异常与catch中声明的异常类型相匹配,那么在try块中其余剩下的代码都将会被忽略,而相应的catch块将会被执行。匹配是指catch所处理的异常类型与
所生成的异常类型完全一致或是它的父类
- 首先执行try块中的语句,如果try块在执行过程中遇到异常,而抛出的异常在catch块里面没有被声明,那么程序立刻退出
- 在catch块中可以加入用户自定义处理信息
- Void printStackTrace();输出异常的堆栈信息。堆栈信息包括程序运行到当前类的执行流程,它将输出
从方法调用处到异常抛出处的方法调用序列
- Sring getMessage();返回异常信息描述字符串。该字符串描述异常产生的原因,是printStackTrace()方法输出信息的一部分
- 常见的异常类型
Exception 异常层次结构的根类
ArithmeticException 算数错误情形,如以零作为除数
ArrayIndexOutOfBoundsException 数组下标越界
NullPointerException 尝试访问null对象成员
ClassNotFoundException 不能加载到所需的类
InputMismatchException 想要得到的数据类型与实际输入的类型不匹配
IllegalArgumentException 方法接收到非法参数
ClassCastException 对象强制类型转换出错
NumberFormatException 数字格式转换异常,如把”abc“转换为数字
- try-catch-finally
- 如果try块中所有语句正常执行完毕,那么finally块就会被执行
- 如果try语句块在执行过程中碰到异常,无论这种异常能否被catch块捕获到,都将执行finally块中的代码
- try-catch-finally中try块是必要的,catch和finally块可选,但至少要出现其一
- 即使在try块和catch块中存在return语句,finally块中的语句也会被执行。发生异常时的执行顺序:
执行try块或catch块中return之前的语句,再执行finally块中的语句,最后执行try块或catch中的return语句退出
- finall块中的语句不被执行的唯一情况,在异常处理代码中执行System.exit(1),将退处Java虚拟机
- 多重catch块
一段代码可能会引发多种异常,这时可以在一个try语句块后面跟多个catch语句块,分别处理不同 的异常
但排列顺序必须是从子类到父类,最后一个一般是Exception类。因为所有的异常都继承自Exception类,所以
如果将父类异常放到前面,那么所有的异常都将会被捕获,后面catch块中的子类异常将得不到被执行的机会
try{
}catch(NumberFormatException e){
}catch(Exception e){
}finally{
}
- 声明异常-throws
Java语言通过关键字throws声明某个方法可能抛出的个中异常。Throws可以同时声明多个异常,中间用逗号隔开
12处理异常的方式-throws
- 通过try-catch捕获并处理异常
- 通过throws继续声明异常,如果调用者不打算处理异常,则可以继续通过throws声明异常
让上一级调用者处理。Main方法的异常将由Java虚拟机处理
- 抛出异常-throw
在Java语言中,可以使用throw关键字来自行抛出异常,交给调用者解决
- throw和throws的区别
(1)作用不同:throw用于在程序中抛出异常;throws用于声明在该方法内抛出的异常
(2)使用的位置不同:throw位于方法体内部,可以作为单独语句使用;throws必须跟在方法参数列表的后面,
不能单独使用
- 内容不同:throw抛出一个异常对象,而且只能是一个;throws后面跟异常类,而且可以跟多个异常类
- Java的异常体系
Java的异常包括许多异常类,他们之间存在继承关系(所有类都继承object类)
- throwable:所有异常类型都是throwabl类的子类,它派生两个子类error和exception
- Error类:表示仅靠本程序本身无法恢复的严重错误,如内存溢出,动态连接失败,虚拟机错误。应用程序
不该抛出这种类型的对象(一般由虚拟机抛出)。假如出现错误,除了尽力使程序安全退出外,在其他方面是无能为力的
- Exception类:由Java应用程序抛出和处理的非严重错误
- RuntimeException:运行时异常,包括RuntimeException类及其所有子类,不要求程序必须对他们进行处理
仍旧可以进行编译和运行,如果运行时发出异常,会输出异常的堆栈信息并中止运行程序
- Checked异常:非运行时异常(编译异常) 除了 运行时异常外的其他由Exception继承来的异常,
程序必须捕获或者声明抛出异常,否则会出现编译错误,无法通过编译。处理方式:(1)try-catch(2)通过throws声明抛出异常,交给上一级调用方法处理
- 日志
日志主要用来记录系统运行过程中的一些重要的操作信息,便于监视系统运行情况,帮助用户提前发现和避开可能出现的问题,或者出现问题后根据日志找到发生的原因
分类:
- SQL日志:记录系统执行的SQL语句
- 异常日志:记录系统运行中发生的异常事件
- 业务日志:记录系统运行过程,如用户登录,操作记录
- 使用log4j的步骤
- 在项目中加入log4j所使用的JAR文件,在MyEclipse选中要使用log4j的项目,然后依次选择
Project properties Java Build Patch Libraries Add Extermal JARs
- 创建log4j.properties文件(src)
- 编写log4j.properties文件,配置日志信息
- 配置
log4j.rootLogger=debug,stdout,logfile
debug指的是日志记录器(Logger)的输出级别
fatal :指出严重的错误事件将会导致应用程序的退出
error:指出虽然发生错误事件,但仍然不影响系统的继续运行
warn:表明会出现错误的潜在情形
info :在粗粒度级别上指明信息,强调应用程序的运行过程
debug:指出细粒度信息事件,对调试应用程序是非常由帮助的
输出级别优先级
fatal>error>warn>info>debug
18.日志输出目的地
log4j.rootLogger=debug,stdout,logfile
Stdout,logfile 指的是日志输出地的名字,log4j允许有多个目的地,一个输出目的地称为 Appender
常用的目的地有两种方式:
- ConsoleAppender:输出日志事件到控制台。通过Target属性配置输出到System.out 或 System.err
默认的目标是System.out
- FileAppender:输出日志事件到一个文件。通过File属性配置文件路径和名称(默认同项目)
- 日志布局类型Layout
目的地必须使用一个与之关联的布局类型Layout,用来指定它的输出样式
- HTMLlayout:格式化日志输出为HTML表格
- SimpleLayout:以一种非常简单的方式格式化日志输出,它输出级别Level,然后跟着一个破折后”——“最后是体制信息
- PatternLayout:根据指定的转换模式格式化日志输出,从而支持丰富多彩的输出格式,需要配置layout.ConversionPattern
- ConversionPattern转换模式
- %d用来设置输出日志的日期和事件,默认格式为ISO8610.也可以在其后指定格式,比如
%d{yyyy-MM-dd HH-mm-ss}
- %m:用来输出代码的指定信息
- %n:用来输出一个回车换行符
- %l:用来输出日志事件的发生位置,包括类名,发生的线程
- %p:用来输出优先级
- %F:用来输出文件名
- %M:用来输出方法名
- 日志的使用
创建一个私有静态的Logger对象,然后就可以通过它的debug()或者error()等方法输出日志信息了
Private static Logger logger=Logger.getLogger(本类名.class.getName());
Logger 对象是用来替代System.out 或者 System.err 的日志记录器
方法
Public void 输出级别(Object msg)
Public void 输出级别(Object msg,Throwable t)
- 常用
### 设置logger的输出级别和输出目的地###
log4j.rootLogger=info,stdout,logfile
###把日志信息输出到控制台###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
###log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout###
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %l %m %n
###把日志信息输出到文件###
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=jbit.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
###log4j.appender.logfile.layout.ConversionPattern=%d %l %F %p %m%n###