第五章 异常——Java
一、什么是异常
异常就是在程序的允许过程中所发生的不正常的事件。
二、异常处理
Java的异常处理是通过五个关键词来实现的: **try、catch、finally、throw和throws **
1.try-catch
- 如果 try 块中所有语句正常执行完毕,不会发生异常,那么 catch 快中的所有语句都将会被忽略。
- 如果 try 语句快在执行的过程中遇到异常,并且这个异常与 catch 中声明的异常类型相匹配。那么 try 快中其余剩下的代码被忽略,而相应的 catch 快将会被执行。匹配是指catch所处理的异常类型与所生存的异常类型完全一致或是它的父类。
- 如果 try 语句块中在执行过程中遇到异常,而抛出的异常在 catch 块里面没有被声明,那么程序立即退出。
- 报异常的方法有以下两种
- void printStackTrace :输出异常的信息。信息包括程序运行到当前类的执行流程,他讲输出从方法调用到异常抛出处的方法调用序列。
- **String getMessage ( ) ** :返回异常信息描述字符串。该字符描述异常产生的类型,是 printStackTrace( ) 方法输出信息的一部分。
- 报异常的方法有以下两种
2.try-catch-finally
- 在 try-catch 语句后加入 finally 快,把该语句放入 finally 块。无论是否发生异常, finally 块中的代码总能被执行。
- try-catch-finally 程序块的执行的流程大致分为两种
- 如果 try 块中所有的语句正常执行完毕,那么 finally 块就会被执行。
- 如果 try 语句块在执行过程中碰到异常,无论这种异常能否被catch块捕获到,都将执行 finally 块中的代码
- try-catch-finally 结构中的 try 块是必需的, catch 和 fina 块为可选,但两者至少必须出现其中之一。
- 需要注意的是,即使在 try 块和 catch 块中存在 return 语句, finally 块中语句也会被执行。发生异常时的执行顺序:执行 try 块或 catch 中 return 之前的语句,执行 finally 块中的语句,执行 try 块或 catch 中的 return 语句退出。
- finally 块中语句不被执行的唯一情况:在异常处理代码中执行 System.exit(1) ,直接退出。
3.多重catch块
- 系统从上到下分别对每个catch语句块处理的异常类型进行检查,并执行第一个与异常类型匹配的catch语句。执行其中一条catch语句之后,其后的catch语句都将被忽略。
- 在使用多重 catch 块中, catch 块的排列顺序必须是从子类到父类,最后一个一般都是 Exception 父类。
4.声明异常——throws
- 在java中用关键字 throws 声明摸个方法可能抛出的各种异常。 throws 可以同时声明多个异常,之间用逗号隔开。被声明异常之后调用必须处理异常
处理异常的两种方式
- 通过 try-catch 捕获
- 通过 throws 继续声明异常。如果调用者不打算处理异常,则可以继续通过 throws 声明异常,让下一个调用者处理异常。 main() 方法声明的异常将由Java虚拟机来处理。
语法
public void 方法名 throws 异常,异常(){}
5.抛出异常——throw
手动抛出异常
语法:
throw new Exception("错误语句");
6.throw和throws的区别表现在以下三个方面
作用不同 :throw 用于在程序中抛出异常;throws 用于声明在该方法内抛出了异常。
使用的位置不同 :throw 位于方法体内部,都可以作为单独语句使用;throws 必须跟在方法参数列表的后面,不能单独使用。
内容不同: throw 抛出一个异常对象,而且只能是一个;throws后面跟异常类,而且可以跟多个异常类。
7.常见的异常类型
| 异常 | 说明 |
|---|---|
| Exception | 异常层次结构的跟类 |
| ArithmeticException | 算术错误情形,如以零作除数 |
| ArrayIndexOutOfBoundsException | 数组下标越界 |
| NullPointerException | 尝试访问 null 对象成员 |
| ClassNotFoundException | 不能加载所需的类 |
| IllegalArgumentException | 方法接收到非法参数 |
| ClassCastException | 对象强制类型转换出错 |
| NumberFormatException | 数字格式转换异常,如把"abc"转换成数字 |
二、.异常的分类

Throwable 类:所有异常都是 Throwable 类的子类,他派生两个子类,即 Error 和 Exception 。
Error 类:表示仅靠程序本身无法恢复的严重错误,如内存溢出动态链接失败,虚拟机错误。应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出的)。加入出现这种错误,除了尽力使程序安全退出为,在其他方面是无能为力的。使用在进行程序设计时,应该更关注 Exception 类。
Exception 类:由java应用程序抛出和处理的非严重错误,如所需文件找不到、网络连接不通或终端、算书运算出错(如被零除)、数字(下标越界)、数组下标越界、装在了一个不存在的类、对null对象操作、类型转换异常等。它的各种不同的子类分半对应不同类型的异常。
运行时异常:包括 RuntimeException 及其使用子类,不要求程序必须对题目做出处理。
Checked 异常:(非运行时异常)除了运行时异常外的其他由Exception继承来的继承类。程序必须捕获或者声明抛出这种异常,否则会出现编译错误,无法通过编译。处理方式包括两种:通过 try-catch 捕获;通过 throws 继续声明异常,交给上一级调用方法处理。
三、Log4j——开源日志记录工具
1.记录的内容分为以下三种:
- SQL日志:记录系统执行的SQL语句。
- 异常日志:记录系统运行中发生的异常事件
- 业务日志:记录系统运行过程,如用户登录,操作记录
2.如何使用log4j记录日志
(1)在项目中加入log4j的 JAR 文件 直接在项目上 Ctrl+C-Ctrl+V
(2)创建 log4j.properties 文件。
(3)编写 log4j.properties 文件
### 设置Logger输出级别和输出目的地 ###
log4j.rootLogger=debug, stdout,logfile
### 把日志信息输出到控制台 ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
### 把日志信息输出到文件:jbit.log ###
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=jbit.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %F %p %m%n
(4)使用 log4j 记录日志信息
声明一个成员变量
private static Logger logger=Logger.getLogger(类名.class.getName());
3.log4j 配置文件
(1)输出级别
日志记录器输出级别:fatal>error>warn>info>debug
日志记录器输出级别:fatal > error > warn > info >debug
日志记录器输出级别:fatal>error>warn>info>debug
fatal:指出验证的错误事件将会导致应用程序的退出
error:指出虽然发生错误事件,但仍然不影响系统的继续运行
warn:表明会出现潜在错误的情形
info:在粗粒度级别上指明消息,强调应用程序的运行过程。
debug:指出细粒度信息事件,对调试应用程序是非常有帮助的。
四、总结:

本文详细介绍了Java中的异常处理机制,包括try-catch-finally、异常类型、异常分类以及如何声明和抛出异常。此外,还讲解了Log4j这一开源日志记录工具的使用,包括日志的三种类型、配置文件设置以及如何在代码中记录日志。
1454

被折叠的 条评论
为什么被折叠?



