1.理解异常
1.1 什么是异常
异常是程序在运行过程中发生的不正常的事件,影响程序的执行。
比如:所需的文件找不到,网络连接中断或不通,算数运算出错,数组小标越界等
1.2 什么是异常处理
异常处理就是对发生的异常做出的补救措施,一些处理的办法,万一发生异常,使用这些措施保证程序的正常运行。
2.异常处理
2.1 异常处理的关键字
Try ; catch; finally; throw; throws
2.2 异常关键字的属性
1)try-catch块
A:如果try块中所有语句都正常执行完毕,不会放生异常,那么catch快中的所有语句都会被忽略。
B:如果try快中有异常,并且这个异常与catch块中的异常类型相匹配,将指向catch块中的语句,try异常语句之后的代码将被忽略(跳过)。
C:如果try语句有异常,而抛出的异常在catch块中没有声明,则程序立刻退出。
2)catch快中输出异常信息的方法
Void printStackTrace();输出异常的堆栈信息。
String getMessage(); 返回异常信息描叙字符串。是Void printStackTrace();输出异常的堆栈信息的一个详细部分
3)try-catch-finally块
A:无论是否发生异常,finally块中的语句都会被执行。
B:try-catch-finally结构中的块try块是必须的,catch和finally块为可选,但是两者至少出现其中之一。
C:即使try块中有return语句,finally语句也会被执行,执行完finally语句后才会执行try语句或catch语句中的return语句退出方法。
D:finally块不被执行的唯一情况,在异常处理代码中执行System.exit(1)
4)多重catch块
在一个try语句后面跟多个catch块可以分别处理不同的异常,但是排列顺序必须从子类到父类,最后一般都是Exception类,如果Exception类放在子类的前面,后面子类将不会被执行。
5)声明异常 throws
Java中通过关键字throws声明某个方法可能抛出的各种异常,throws可以同时声明多个异常,之间用逗号隔开
6)抛出异常 throw
在java中可以使用throw关键字来自行抛出异常
7)throw和throws的区别:
A:作用不同:throw用于在程序中抛出异常;throws用于声明方法内抛出了异常类型
B:使用的位置不同:throw位于方法体内部,可以作为单独语句使用;throws必须跟在方法参数列表后面,不能单独使用。
C:内容不同:throw抛出一个异常对象,而且只能是一个;throws抛出异常类,而且可以是多个异常类。
3.处理异常的方式
A:通过try-catch捕获并处理异常。
B:通过throws继续声明异常,如果调用者不打算处理该异常,则可以继续通过throws声明 异常类,让上一级调用者处理。Main()方法声明的异常将有java虚拟机来处理。
3.异常的分类
一是:Error类
程序本身无法恢复的严重错误。非重点,如虚拟机错误,内存溢出动态链接失败。
二是:Exception类
有java应用程序抛出和处理的非严重错误,主要包括:运行时异常(RunTimeException)和 非运行时异常(checked)
@1:RunTimeException
出现异常仍可以编译和运行 主要包括:
1.)ArithmeticException 算数错误异常类;如除数为0
2.)ArrayIndexOfBoundsException 数组下表越界
3.)NullPointerException 对象为空(空指针)
5.)InputMismatchException 欲得到的数据类型和实际输入的不匹配
6.)IllegalArgumentException 方法接受到非法的参数,实参类型不对
7.)ClassCastException 对象强制类型转换出错
8.)NumberFormatException 数字格式转换异常 比如把“abc”转换成数字
9.)ArrayStoreException(数据存储异常,操作数组时类型不一致)
@2:Checked
非运行时异常类,程序必须捕获或抛出这种异常,否则会出现编译错误,无法通过编译。处理方式包括两种:一,通过try-catch在当前位置捕获并且处理异常;二,通过throws声明抛出异常类,交给上一级调用方法处理。主要包括:
.)ClassNotFoundException 不能加载所需要的类
4.开源日志记录工作log4j
4.1 日志记录的分类
SQL日志:记录执行系统执行SQL的语句
异常日志:记录系统运行中发生的异常事件
义务日志:记录系统运行过程,如用户从操作,操作记录
4.2 使用log4j的步骤
在项目中加入log4j所使用的JAR文件
创建log4j.properties文件
编写log4j.properties文件,在log4j.properties文件里source里面编写,配置日志信息
在程序中使用log4j记录日志信息
4.3 log4j的使用语法实例
4.3.1 编写log4j.properties文件:
#设置logger输出级别和输出目的#
log4j.rootLogger=debug,stout,logFile
#把日志信息输出到控制台#
log4j.appender.stout=org.apache.log4j.ConsoleAppender
log4j.appender.stout.Target=System.err
log4j.appender.stout.layout=org.apache.log4j.SimpleLayout
#把日志信息输出到文件:jbit.log#
log4.appender.logFile=org.apache.log4j.FileAppender
log4.appender.logFile.File=jbit.log
log4.appender.logFile.layout=org.apache.log4j.PatternLayout
log4.appender.logFile.layout.ConversionPattern=%d{YYYY-MM-DD HH:mm:ss}%1 %F %p %m%n
4.3.2 在程序中使用log4j记录日志信息
package cn.shortAnswer5;
import org.apache.log4j.Logger;
import cn.shortAnswer2.Test;
public class Tset {
public static Logger logger=Logger.getLogger(Test.class.getName());
/**
* @param args
*/
public static void main(String[] args) {
int[] array=new int[2];
try {
array[2]=5;
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("数组下标越界");
logger.debug(e);
e.printStackTrace();
}
}
}
4.4 日志的输出级别及属性
Fatal:指严重的错误事件会导致应用程序的退出
error:指虽然发生错误事件,但仍然不影响系统的继续运行。
Warn:表明会出现潜在错误的情形
Info:在粗粒度级别上指明消息,强调程序的运行过程。
Debug:指出细粒度的信息事件,对调试应用程序非常有帮助。
4.4.1 各个输出级别的优先级:
Fatal>error>warn>info>dubug
4.4.2 日志输出目的地Appender
Log4j.rootLogger=debug,stdout,logfile
其中stdout,logfile指日志输出目的地的名字,可以随便起。
Log4j日志允许输出到多个目的地,一个输出目的地称为一个Appender,最常用的有两种:
A:ConsoleAppender:输出日志到控制台。通过Target属性配置输出到System.out或System.err,默认是System.out。
B:FileAppender;输出日志到一个文件。通过file属性配置文件的路径及名称。
4.4.3 日志布局类型layout
Appender类必须使用一个与之相关联的布局类型Layout,用来指定它的输出样式,常见的样式有三种:
A:HTMLLayout;格式化日志输出为HTML表格。
B:SimpleLayout;以一种简单的格式输出,它输出的级别是level,然后跟着一个破折号“-----”最后是日志信息。
C:PatternLayout;根据指定的转换格式输出。需要配置layout.ConversionPattern属性,如果没有将会使用默认的转换样式。
4.4.4 转换模式ConversionPattern
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2011-10-18 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个"%"字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为"
",Unix平台为"
"输出日志信息换行 .