java入门第九篇:异常及log4j的使用
[java的异常]
1.java中所有异常和错误的基类是Throwable
*
* Throwable
*
* Error Exception
* (检查时异常) (运行时异常)
*
* 2.java中的异常分为运行时异常和检查时异常。
* 运行时异常表示RuntimeException以及所有子类,这些异常无需在程序中进行捕获, 大多可以通过代码进行控制避避免。
* 检查时异常除了RuntimeException以及其所有子类的其他异常,要求必须在程序中捕获处理。
*
* 3.自定义异常类,必须继承自现有异常类,通常继承Exception 或者RuntimeException
* 分别表示声明了一个检查时异常和运行时异常。
*
*
* [使用try catch进行捕获]
*
* 1.使用try{}捕获可能会出问题的代码,使用多个catch块进行不同异常的处理操作。
* 当try块中的程序出现异常时,将进入对应的catch块进行操作,而不再执行try中剩余的代码。
*
* !!使用try catch捕获异常后,程序出现异常,将不会阻断程序的运行。
*
* 2.catch块可以有多个,一般最后使用Exception作为结束,表示捕获所有异常; catch块在顺序上,必须从小到大。
*
* 3. e.getMessage() 拿到错误信息; e.printStackTrace()打印错误的堆栈信息
*
* 4.try_catch 为了保证程序不被中断,必须保证能捕获程序中所有异常。
*
* 5.finally{}表示程序是否出现异常都必须执行的语句。 通常用于流的关闭,资源释放等操作。 即便块中有return;
* 也必须执行完finally中的语句。 使用system.exit(int i);程序完全结束,不执行finally。
*
* 6.try-finally可以组合存在,而不一定必须包含catch 表示出现异常不进行处理,执行finally中的语句。其他代码无法执行。
*
*
*
*
*
* [throws和throw]
*
* 1.在方法体中,如果出现异常,可以不进行try-catch捕获,可使用throws在方法声明上进行抛出;
* 抛出后,由调用该方法的地方进行捕获,如果不捕获可以继续抛出。
* 原则上,在main方法中必须进行异常处理,如果继续抛出将导致程序出现异常而无法发现。
*
* 2.throws如果抛出多个异常 使用,分隔。
*
* 3.throw 在程序中手动抛出异常 public static void setAge(int i){ if(i<0||i>100){
* throw new IllegalArgumentException("您输入的年龄不合法");
*
* 4.如果使用throw抛出的是一个检查型异常,必须在方法体上使用throws抛出异常,
* 如果使用throw抛出的是一个运行时异常,那么不需要在方法体上抛出异常。
*
* 5.如果这个异常 系统没有 throw new RuntimeException("异常"); 或throw new
* Exception("异常")。 } }
【常用的异常】
ArithmeticException - 算术运算异常
NumberFormatException - 数字格式异常
IndexOutOfBoundsException - 下标越界异常
NegativeArraySizeException - 创建一个大小为负数的数组错误异常
NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常。
* [log4j 的使用]
*
* 1.导入log4j.jar 再Add
*
* 2.在log4j同级目录下创建log4j.propeities
*
* 3.在需要打印日志的类中,通过Logger.getLogger(本类名.class)拿到一个日志对象。
*
* 4.使用日志对象,分别调用不同级别的打印语句,进行日志的输出。
* logr.debug("打印一条debug信息");
logr.info("打印一条info信息");
logr.warn("打印一条warn信息");
logr.error("打印一条error信息");
#1.log4j.rootLogger表示总配置
# log4j.rootLogger=[level],appenderName1(适配器名字),appenderName2.
[level]:ERROR 3
Warn 4
INFO 6
DEBUG 7
#log4j.rootLogger=设置INFO表示级别大于INFO的都可进行日志输出。
log4j.rootLogger=debug, logfile,stdout
#2.进行各个适配器的配置,
# log4j.appender.适配器名字= 为日志指定输出目的地
# org.apache.log4j.ConsoleAppender(控制台),
# org.apache.log4j.FileAppender(文件),
# org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
# org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
# org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
#3.log4j.appender.stdout.Target=设置控制台打印的语句样式(控制台才有)
#4.log4j.appender.logfile.Append = true true,不覆写,false写入时清空文件,再写入。
#5.log4j.appender.logfile.Threshold = DEBUG为当前适配器设置单独的级别。
#6.log4j.appender.logfile.layout=使用哪种布局结构 进行日志显示
# org.apache.log4j.HTMLLayout(以HTML表格形式布局),
# org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
# org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
# org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
#7.log4j.appender.logfile.layout.ConversionPattern= 设置patternLayout的格式。
# %m 输出代码中指定的消息
# %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
# %r 输出自应用启动到输出该log信息耗费的毫秒数
# %c 输出所属的类目,通常就是所在类的全名
# %t 输出产生该日志事件的线程名
# %n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
# %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},输出类似:2002年10月18日 22 : 10 : 28 , 921
# %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java: 10 )
#8.log4j.appender.logfile.MaxFileSize=20MB org.apache.log4j.RollingFileAppender时可以设置文件最大容量。
#90log4j.appender.logfile.MaxBackupIndex=10 org.apache.log4j.RollingFileAppender时可以设置文件最大数量。