• JAVA中的异常处理及日志(log4j为例)的使用


    Java的异常

    1.Java中所有异常和错误的基类:Throwable
        Throwable
      error        Exception
          (检查时异常)(运行时异常)
                 RuntimeException
    2.Java中的异常分为运行时异常和检查时异常

    运行时异常是表示RuntimeException以及所有子类,这些异常无需再程序中捕获,大多可以通过代码进行控制避免

    检查时异常:除了RuntimeException以及其所有子类之外的所有异常,这些异常必须在程序中进行捕获处理。

    异常的第一种处理机制——使用try-catch进行异常捕获

    1.使用try块包裹可能出现异常的代码,使用多个catch块进行不同异常的处理

    当try块中的程序出现异常时,将进入对应的catch块进行操作,而不再执行try块中的代码

    使用try—catch捕获异常后,如果程序出现异常,将不会阻断程序的运行

    2。catch块可以有多个,一般最后用catch(Exception e)收尾,表示捕获所有异常
    但多个catch块顺序必须由小到大

    3.e.getMessage():拿到错误信息
    e.printStackTrace(); 打印堆栈信息

    4.try catch结构如果需要确保程序不被中断,必须确保程序块可以捕获程序中可能出现的所有异常(最后用catch(Exception e)收尾)

    5.finally表示无论程序是否出现异常,都必须执行的语句,即便try块中有return语句也必须执行完finally才能结束当前方法。

    但是使用System.exit(0); 退出程序,将不再执行finally的语句

    所以,finally通常用于进行流的关闭,资源释放等操作

    6.try-finally可以组合存在,而不一定必须包含catch
    表示出现异常不进行操作,但是finally中的代码必须执行

    异常的第二种处理机制——抛出机制

    1.在方法体中如果出现异常,可以不用try-catch捕获,而使用throws在方法声明上进行抛出
    抛出后,在调用方法的地方进行抛出,如果捕获可以继续抛出
    原则上,main方法中必须进行异常处理,如果继续抛出将会导致程序出现异常而无法发现

    2.throws如果抛出多个异常,可以使用逗号分隔

    3.throw 在程序中手动抛出异常 

    throw new IOException("输入年龄不合法");

    4.如果使用throw抛出的是一个检查型异常,那必须在方法体上使用throws进行抛出声明

    如果使用throw抛出的是一个运行时异常,那么不必再使用throws进行抛出声明。

    实例代码:

    try {
        setAge(110);
    } catch (IOException e) {   
        e.printStackTrace();
    }
    public static void setAge(int i) throws IOException{
        if(i<0||i>100){
            throw new IOException("输入年龄不合法");
        }
    }

    如何自定义异常类

    自定义异常类,必须继承现有异常类。
    通常继承Exception或者RuntimeException,分别表示声明了一个检查时异常和一个运行时异常。

    实例代码:

    class AgeException extends Exception{
        private String message=null;
        
        public AgeException(){
            
        }
        public AgeException(String message){
            this.message=message;
        }
        public String getMessage(){
            return message;
        }
    }
    class AgeRuntimeException extends RuntimeException{
        private String message=null;
        
        public AgeRuntimeException(){
            
        }
        public AgeRuntimeException(String message){
            this.message=message;
        }
        public String getMessage(){
            return message;
        }
    }

    log4j的使用
    1.导入log4j-1.2.17.jar

    2.在src目录同级下,创建log4j.properties配置文件

    3.在需要打印日志的类中通过Logger.getLogger()拿到一个日志对象,参数传入本类.class

    4.使用日志对象,分别调用不同级别的打印语句进行日志的输出!
      log.debug("打印一条debug信息");
      log.info("打印一条info信息");
      log.warn("打印一条warn信息");
      log.error("打印一条error信息");


    log4j的配置文件log4j.properties

    #log4j.rootLogger 表示根配置。
    #log4j.rootLogger  =   [ level ]   ,  appenderName1 ,  appenderName2
    #level 表示可以写入日志的级别:
    #ERROR > WARN > INFO > DEBUG 
    #设置info 表示级别大于info的都可以进行日志输出
    
    # 级别后面的多个选项,表示多个适配器的名字,适配器的名字可以随便起
    log4j.rootLogger=info, logfile,A,B
    
    # 进行各个适配器的配置。  log4j.appender.适配器名字
    
    #[为Appender指定日志输出目的地]
    #org.apache.log4j.ConsoleAppender(控制台),
    #org.apache.log4j.FileAppender(文件),
    #org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
    #org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
    log4j.appender.A=org.apache.log4j.ConsoleAppender
    # 设置控制台打印的语句。 System.out/System.err
    log4j.appender.A.Target=System.err
    # 使用哪种布局进行日志显示:
    #  org.apache.log4j.HTMLLayout(以HTML表格形式布局),
    # org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
    # org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
    #org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
    log4j.appender.A.layout=org.apache.log4j.SimpleLayout
    
    
    log4j.appender.logfile=org.apache.log4j.FileAppender
    # 设置文件的地址
    log4j.appender.logfile.File=mylog.log
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
    # 为PatternLayout进行样式的设置。
    #   %m   输出代码中指定的消息
    #  %p   输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL 
    #  %r   输出自应用启动到输出该log信息耗费的毫秒数 
    #  %c   输出所属的类目,通常就是所在类的全名 
    #  %t   输出产生该日志事件的线程名 
    #  %n   输出一个回车换行符,Windows平台为“
    ”,Unix平台为“
    ” 
    #  %d   输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},输出类似:2002年10月18日  22 : 10 : 28 , 921  
    #  %l   输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java: 10 ) 
    log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %F %p %m%n
    # 为当前适配器,指定单独的级别,可以覆盖rootLogger的配置
    log4j.appender.logfile.Threshold = warn
    # 表示写入新日志时,是否清空日志文件;false表示清空原文件,true表示在原文件后面追加新日志
    log4j.appender.logfile.Append = false
  • 相关阅读:
    HDOJ_1010 Tempter of the Bone
    矩阵旋转
    HDU 2544 最短路 http://acm.hdu.edu.cn/showproblem.php?pid=2544
    题目连接:http://acm.zznu.edu.cn/problem.php?id=1329
    队列/优先队列(代码简单模式)
    虚拟方法调用
    Vim中分屏(整理)
    Java Web设计模式之依赖倒换原则
    Java Web 设计模式之开闭原则
    Java 2+2=5
  • 原文地址:https://www.cnblogs.com/hjcblog/p/8905893.html
Copyright © 2020-2023  润新知