第六章 异常处理与日志 v1.0
第一部分 异常类型
一、概述
1.异常类型解释
在 Java 中所有异常类型都是内置类 java.lang.Throwable 类的子类,即 Throwable 位于异常类层次结构的顶层。Throwable 类下有两个异常分支 Exception 和 Error。
- Exception 类用于用户程序可能出现的异常情况,它也是用来创建自定义异常类型类的类。异常类 Exception 又分为运行时异常和非运行时异常,这两种异常有很大的区别,也称为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。
- Error 定义了在通常环境下不希望被程序捕获的异常。一般指的是 JVM 错误,如堆栈溢出。
其中异常类 Exception 又分为运行时异常和非运行时异常,这两种异常有很大的区别,也称为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。
二、常见异常
1.常见运行时异常
2.常见非运行时异常
第二部分 异常处理
一、概述
1.异常处理关键字
Java 的异常处理通过5个关键字来实现:try、catch、throw、throws 和 finally
2.异常处理执行流程图

二、处理异常
1.基本结构
try { // 用try-catch语句捕获并处理异常
逻辑程序块
} catch(ExceptionType1 e) {
处理代码块1
} catch (ExceptionType2 e) {
处理代码块2
throw(e); // 抛出这个异常
} catch (ExceptionType3|ExceptionType4) { //Java7提供多异常捕获
处理代码块3
} catch (Exception e) {
e.printStackTrace(); // 打印异常栈信息
} finally {
释放资源代码块 // 不管有无异常,除exit()外,总会在最后执行;即使return,也会在其之前执行
}2.抛出异常
基本结构:throw ExceptionObject;
3.异常声明
当一个方法产生一个它不处理的非运行时异常(运行时异常无需声明,会自动捕获)时,那么就需要在该方法的头部声明这个异常,以便将该异常传递到方法的外部进行处理。
基本结构:返回值 方法名(参数列表) throws Exception1, Exception2, ... {...}
规范格式:返回值 方法名(参数列表) throws Exception {...}
4.自定义异常类
自定义异常类一般包含两个构造方法:一个是无参的默认构造方法,另一个构造方法以字符串的形式接收一个定制的异常消息,并将该消息传递给超类的构造方法。
class MyException extends Exception {
public MyException() {
super();
}
public MyException(String s) {
super(s);
}
}第三部分 日志
一、体系结构
1.Java日志规范
一些接口,提供给日志的实现框架设计的标准。
- 日志规范接口(
Commons Logging, JCL) - 简单日志接口(
Simple Logging Facade for Java, slf4j)
2.常见日志框架
- Log4j
- JUL(java.util.logging)
- Logback
二、Logback框架
Logback是由log4j创始人设计的另一个开源日志组件,基于slf4j实现,性能比log4j要好。
1.三大技术模块
- logback-core:logback-core模块为基础模块,为其他两个模块奠定了基础。
- logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API。
- logback-access模块:与Tomcat和Jetty等Servlet容器集成,以提供HTTP访问日志功能
实现Logback最小依赖模块:slf4j-api(日志规范)、logback-core、logback-classic
2.使用Maven构建
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>注意:低版本JDK可能不支持最新版本,可能需要降低依赖版本,以上配置JDK8可用。
3.配置文件(logback.xml)
应当放置在resources根目录下,用于配置Logback框架
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- CONSOLE :表示当前的日志信息是可以输出到控制台的 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--输出流对象 默认 System.out 改为 System.err 其中err:控制台输出日志为红色,而out为黑色-->
<target>System.out</target>
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c [%thread] : %msg%n</pattern>
</encoder>
</appender>
<!-- File:表示当前的日志信息是可以输出到文件的 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--日志输出路径(logback_message.log是文档名,下方还有一处文件名(不用写.log))-->
<file>D:/Programming_Learning/Java Code/GuoZiYunLearning/project/logback-try/src/main/resources/log/log.log</file>
<!--指定日志文件拆分和压缩规则(防止文件过大)-->
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--通过指定压缩文件名称,来确定分割文件方式-->
<fileNamePattern>D:/Programming_Learning/Java Code/GuoZiYunLearning/project/logback-try/src/main/resources/log/logback_message-%d{yyyy-MMdd}.log%i.gz</fileNamePattern>
<maxFileSize>1MB</maxFileSize> <!--文件拆分大小-->
</rollingPolicy>
</appender>
<!--
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF(关掉),默认debug(可忽略大小写)
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<root level="ALL"> <!--打印规则:只打印不低于当前级别的日志-->
<appender-ref ref="CONSOLE"/> <!--如果这个地方不配置关联打印的位置,改位置将不会记录日志-->
<appender-ref ref="FILE" level="WARN"/><!--可以为各元素单独配置日志级别-->
</root>
<!-- <logger name="指定软件包" level="ALL" additivity="true" >
<appender-ref ref="..."/>
</logger> -->
</configuration>4.创建与使用日志对象
public static final Logger LOGGER= LoggerFactory.getLogger("当前类.java"); //如:Test.class
public static void main(String[] args) {
LOGGER.info("程序执行中"); //INFO级别输出
}5.日志级别设置
级别程度依次是: TRACE<DEBUG<INFO<WARN<ERROR;默认级别是DEBUG(忽略大小写),对应其方法。
具体在<root level="INFO">标签或其元素appender-ref的level属性中设置日志级别。