网站开发实用技术介绍/怎么优化
一、异常
1、什么是异常
Java语言将运行时发生的不正常严重错误称为异常,对异常的处理成为异常处理。下面举出两种不同的异常:
public class Test {public static void main(String[] args) {System.out.println(1/0);Class.forName("");}
}
由于数学运算时分母不可为零,所以此时在执行是会发生异常;而下面的Class.forMame后面括号中不存在类名,所以会发生异常。
2、异常的后果
一旦发生异常:同级代码将午饭执行,如:
此时程序的结果为:111加上后面的System.out.println(1/0);报错提示(java.lang.ArithmeticException: / by zero)
3、Java中异常的分类:
一、父类:throwable方法,两个子类:Exception与Error(继承) 父类中的两个常用方法
1、public String getMessage():获取异常信息;
2、public void printStackTrace():输出异常堆栈中的异常信息
二、由于Error类中的错误是Java 中的JVM进行处理,所以本节所论述是:Exception中的异常,其中Exception中的异常可以分为两类:运行时异常(RuntimeException)和检查时异常(除RuntimeException中的Exception其他全部子类)
三、如何区分运行时异常和检查时异常
1、运行时异常:
在Eclipse中书写编写代码时运行时异常是不会报错的即可以javac编译成功,如:
2、检查时异常
检查时异常是不能被Javac编译通过的
在Eclipse中可以Ctrl键点击找到异常的父类从而确定
二、检查异常
1、关键字try catch finally 检查异常
一、try {} catch(Exception e){} 的使用
将try括号后面的错误类型被catch捕捉当做其后面的形参;此时再执行catch后面的代码,此时即便是try后面的代码异常,也可以向下进行;
System.out.println(100);try{System.out.println(1/0);}catch(ArithmeticException e) {e.printStackTrace();}System.out.println(200);
二、try 之后的catch可以使用多个:
try{System.out.println(1/0);}catch(ArithmeticException e) {e.printStackTrace();}catch(NullPointerException e) {e.printStackTrace();}catch(Exception e) {e.printStackTrace();}
此时在检查类型是,从最前面的catch往后执行,检查到第一个符合标准的执行后面的语句(此时注意,即便是try后面的语句中又不止一个异常,由于执行到第一个异常时出现的同级代码不执行原理,也就只能检查到一个)
提示:catch括号后面的参数的类级别必须由小到大:否则由于多态的缘故会出现无法访问的代码
三、finally:
finally必须和try搭配:此时无论其中的代码是否执行,均会执行finally后的代码
try{System.out.println(1);}catch(ArithmeticException e) {e.printStackTrace();}catch(NullPointerException e) {e.printStackTrace();}catch(Exception e) {e.printStackTrace();}finally {System.out.println("可以有");}
此时没有错误:但代码执行后:可以有
2、使用log4j检查异常
public static void main(String[] args) {for(int i=1;;i++) {try {System.out.println(1/0);}catch(ArithmeticException e){System.out.println(i);e.printStackTrace();}}}
运行结果第一行
一、背景:在执行异常检测时,将异常信息打印控制台,存入一点缓存区中,缓存区饱满时,会删除前面的已有数据进而缓和数据,所以诞生了一个新的方法来将所有的异常检验全部导出:log4j
二、如何使用log4j
1、引入包(log4j-1.2.15.jar)
2、在包中创建文件:log4j.properties
3、在文件中输入下面的代码:
# DEBUG设置输出日志级别,由于为DEBUG,所以ERROR、WARN和INFO 级别日志信息也会显示出来
log4j.rootLogger=DEBUG,Console,RollingFile#将日志信息输出到控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern= [%-5p]-[%d{yyyy-MM-dd HH:mm:ss}] -%l -%m%n
#将日志信息输出到操作系统D盘根目录下的log.log文件中
log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingFile.File=D://log.log
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p %-40.40c %X{traceId}-%m%n
4、在异常检测的类中创建对象
static Logger logger = Logger.getLogger(类名.class);
5.在catch关键字后面添加
logger.info(e.getMessage(),e);
6、执行程序,在D盘中找到log.log进行查看
可以看出,同样是第一行,在控制台上已经删除了一部分;
三、间歇性产生新日志文件
在检查错误时往往会时创建的log.log文件过大而不方便使用,此时我们可以采用每一分钟创建一个新的log.log文件、从而是每个log文件变得很小,从而方便阅读;
# DEBUG设置输出日志级别,由于为DEBUG,所以ERROR、WARN和INFO 级别日志信息也会显示出来
log4j.rootLogger=DEBUG,RollingFile
#每天产生一个日志文件(RollingFile)
log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender
#当天的日志文件全路径
log4j.appender.RollingFile.File=d:/logs/sirius.log
#服务器启动日志是追加,false:服务器启动后会生成日志文件把老的覆盖掉
log4j.appender.RollingFile.Append=true
#日志文件格式
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p %-40.40c %X{traceId}-%m%n
log4j.appender.RollingFile.Threshold=DEBUG
#设置每天生成一个文件名后添加的名称,备份名称:sirius.log.年月日时分.log
log4j.appender.RollingFile.DatePattern='.'yyyy-MM-dd-HH-mm'.log'
程序执行成功