异常和log4j2使用

异常

1.概念

在程序的运行过程中所发生的不正常的事件并且该事件可以处理,它会中断正在运行的程序

2.分类

在这里插入图片描述

Error:代表的系统级别错误(属于严重问题)
系统一旦出现问题,sun公司会把这些错误封装成Error对象
Exception:代表程序可能出现的问题
所有的异常类是从 java.lang.Exception 类继承的子类
核心:提醒程序员检查本地信息

RuntimeException:运行时异常
可以在程序中避免的异常
当程序进行时发生异常,会输出异常堆栈信息并终止程序运行
可以使用try-catch语句捕获
核心:表示由于参数错误导致的问题

CheckedException:编译时异常
直接继承Exception类
程序员无法预见
编译器会提示
如果不进行捕获,则会出现编译错误

3.异常处理

Java编程语言使用异常处理机制为程序提供了错误处理的能力

  • Java中,所有的异常都定义为类
  • 除了内置的异常类之外,Java也可以自定义异常类
  • Java的异常处理机制也允许自行抛出异常

4.关键字作用

在这里插入图片描述

5.捕获异常组合

try{//try监听,只能有1个
    //有可能出现异常的语句
}catch(异常类型 异常对象){//catch捕获异常可以有0~n个
    //异常处理语句
}...
catch(Exception e){
    //异常处理语句
}
}finally{//finally最终执行可以有0或1个,和catch不能同时省略
    //一定会运行到的语句
}

(1)try-catch块

Ⅰ.无异常

会把try里面的所有代码全部执行完毕,不会执行catch里面的代码
在这里插入图片描述

Ⅱ.有单个异常

①catch匹配的异常:try代码块中出现异常代码的下面的代码不会执行,直接跳转到对应的 catch当中,执行catch里面的语句体,如果没有对应catch与之匹配,那么还是会交给虚拟机进行处理
②catch不匹配的异常:try代码块中的出现的问题未被捕获,最终还是会交给虚拟机进行处理
在这里插入图片描述

Ⅲ.有多个异常
会写多个catch与之匹配,如果捕捉多个异常,且这些异常存在父子类关系,那么父类一定要写在下面
在这里插入图片描述

(2)try-catch-finally块

①无论是否出现异常,都会执行finally块中代码

java基础—try、catch、finally代码块中存在return语句的执行顺序-CSDN博客
java:try catch异常中的return返回机制测试与总结
③除非在try块或者catch块中调用了退出虚拟机的方法(即System.exit(1);),否则不管在try块、catch块中执行怎样的代码,出现怎样的情况,异常处理的finally块总是会被执行的
在这里插入图片描述

6.异常方法

在这里插入图片描述

7.抛出异常

(1)throws

  • 写在方法定义处,表示声明一个异常
  • 告诉调用者,使用本方法可能会有哪些异常
public void 方法() throws 异常类名1,异常类名2...{
}

(2)throw

  • 写在方法内,结束方法
  • 手动抛出异常对象,交给调用者,不能抛在main()方法上
  • 方法中下面的代码不再执行
  • throw抛出的只能是Throwable类或其子类的对象
public void 方法(){
    throw new Exception();
}

(3)throw和throws的区别

  • throws是声明异常用在方法上,throw是抛出异常用在方法中。
  • throws后面加 异常类 , throw后面加 异常对象
  • throws 是可能发生异常 ,throw是已经发生异常。

8.自定义异常

当Java异常体系中提供的异常类型不能满足程序的需要时,可以自定义异常类

(1)代码示意

/** @Desc描述:年龄超出范围异常,年龄是因为参数错误导致的异常*/
public class AgeOutBoundsException extends RuntimeException {
    /**空参构造 */
    public AgeOutBoundsException() {
    }

    /**有参构造
     * @param message*/
    public AgeOutBoundsException(String message) {
        super(message);
    }
}
/**设置年龄范围0-119*/
public void setAge(int age) throws AgeOutBoundsException{
    if (age<0||age>120){
        throw new AgeOutBoundsException(age+"输入年龄有误!");
    }else {
        this.age = age;
    }
}
@Test
public void testAgeOutBoundsException(){
    Main main=new Main();
    try {
        main.setAge(9999);
    } catch (AgeOutBoundsException e) {
        e.printStackTrace();//AgeOutBoundsException: 9999输入年龄有误!
    }
}

(2)应用场合

  • 项目中因业务逻辑错误需要抛出异常,但Java中不存在这类异常例如,年龄异常、性别异常等
  • 项目开发一般是由团队成员共同完成,为统一对外异常展示的方式,可以使用自定义异常

二、日志记录框架(log)

1.概述

  • 主要用来记录系统运行中一些重要操作信息
  • 便于监视系统运行情况,出现问题后根据日志找到原因

2.分类

SQL日志、异常日志、业务日志

3.主要用途

  • 问题追踪
  • 状态监控
  • 安全审计

4.操作步骤

(1)导包log4j2

一文带你彻底掌握Log4j2

在这里插入图片描述

(2)编写配置文件

文件后缀可为.xml、.json或者.jsn,一般用log4j2.xml命名

<?xml version="1.0" encoding="UTF-8" ?>

<!--configuration:根节点
status:可以用来指定log4j2本身打印日志的级别,
monitorInterval:用来设置配置文件的动态加载时间,单位是秒,最小是5秒-->
<configuration staus="OFF">
    <!--appenders:日志输出目的地集合-->
    <appenders>
        <!--Console:日志输出到控制台的配置节点
        name:指定节点名称
        target:SYSTEM_OUT:输出黑色 SYSTEM_ERR:输出红色-->
        <Console name="Console" target="SYSTEM_OUT">
            <!--PatternLayout:设置输出格式
            %d:用来设置输出日志的日期和时间,默认格式为ISO8601
            %m:输出代码中指定的消息
            %t:用来输出当前线程的名称
            %5level:输出日志级别,-5表示左对齐并固定输出5个字符,如果不足,则在右边补0
            %l:用来输出日志时间的发生位置,包括类名、发生的线程、以及在代码中的行数
            %logger:输出logger名称
            %msg:日志文本
            %n:换行-->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%l] %-5level - %msg%n"/>
        </Console>
        <!--File:日志输出到文件的配置节点
        name:指定appenders名称
        fileName:指定输出日志的目的文件,必须是全路径的文件名
        PatternLayout:输出格式,不设置时,默认为%m%n-->
        <File name="log" fileName="log/test.log">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%l] %-5level - %msg%n"/>
        </File>
    </appenders>
    <!--loggers:logger集合,可配置多个logger-->
    <loggers>
        <!--root:用来指定项目的根日志,如果没有单独的logger节点,则会默认按此节点配置进行日志输出
        level:指出日志级别,从高到低OFF>fatal>error>warn>info>debug>trace>all-->
        <root level="all">
            <!--appender-ref:指定日志输出的目标appender-->
            <appender-ref ref="Console"/>
            <appender-ref ref="log"/>
        </root>
    </loggers>
</configuration>

(3)定义日志记录器Logger

获取日志记录器的方式

//在main()方法里调用
static Logger logger= LogManager.getLogger(类名.class);

(4)记录日志

Logger类可以替代System.out或者System.err,供开发者记录日志信息

Ⅰ.Logger类常用方法

在这里插入图片描述

Ⅱ.日志级别

•程序会输出高于或等于所设置级别的日志
•设置的日志等级越高,输出的日志就越少
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值