1.什么是异常
异常就是在程序的运行过程中所发生的不正常的事件,如所需文件找不到,网络连接不通或者中断,算术运算出错,数组下标越界,对null对象操作,类型转换异常等。异常会中断正在运行的程序。
2.什么是异常处理
异常处理机制就像我们对平时可能会遇到的意外情况,预先想好了一些处理的办法。也就是说,在程序执行代码的时候,万一发生了异常,程序会按照预定的处理办法对异常进行处理,异常处理完毕之后,程序继续运行。
Java的异常处理是通过五个关键字来实现的:try,catch,finally,throw和throws。
2.1 try-catch块
在Java的异常处理机制进行处理,把可能出现异常的代码放入try语句块中,并使用catch语句块捕获异常。
try-catch程序块的执行流程比较简单,首先执行的是try语句块中的语句,这时可能会有以下三种情况。
a. 如果try块中所有语句正常执行完毕,不会发生异常,那么catch块中的所有语句都会被忽略。
b. 如果try语句在执行过程中遇到异常,并这个异常与catch中声明的异常类型相匹配,那么在try块中剩下的代码都会被忽略,而相应的catch块将会被执行。匹配是指catch所处理的异常类型与所生成的异常类型完全一致或者是它的父类。
c. 如果try语句在执行过程中遇到异常,而抛出的异常在catch块中没有声明,那么程序立刻退出。
在catch块中可以加入用户自定义处理信息,也可以调用异常对象的方法输出异常信息,常用的方法主要有以下两种。
a. void printStackTrace() :输出异常的堆栈信息。
b. String getMessage() :返回异常信息描述字符串。
常见的异常类型 | |
---|---|
异常 | 说明 |
Exception | 异常层次结构的根类 |
ArithmeticException | 算术错误 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 访问null对象成员 |
ClassNotFoundException | 不能加载所需的类 |
InputMismatchException | 数据类型不匹配 |
IllegalArgumentException | 方法接收到非法参数 |
ClassCastException | 强制类型转换出错 |
NumberFormatException | 数字格式转换异常 |
2.2 try-catch-finally 块
try-catch-finally程序块的执行流程分为两种情况。
a. 如果try正常执行完毕,那么finally块就会被执行。
b. 如果try碰到异常,无论异常能不能被catch捕获,finally都会执行。
try-catch-finally结构中的try块是必需的,catch和finally块为可选,但两者必须出现其中之一。finally块中语句不被执行的唯一情况:在异常处理代码中执行System.exit(1);将退出Java虚拟机。
2.3 多重catch块
一段代码可能引发多种类型的异常。我们可以在一个try语句后面跟多个catch语句块,分别处理不同的异常。但排序顺序必须是子类到父类,最后一个一般都是Exception类。因为所有异常子类都继承Exception类,所以如果将父类放在前面,那么所有的异常都会捕获,后面的catch块中的子类异常将得不到被执行的机会。
2.4 声明异常——throws
在Java语言中通过关键字throws声明某个方法可能抛出的各种异常。throws可以同时声明多个异常,之间用逗号隔开。
通过如下两种方式进行处理。
a. 通过try-catch捕获并处理异常
b. 通过throws继续声明异常。
3.抛出异常
3.1 抛出异常——throw
在Java中可以使用throw关键字来自行抛出异常。
throw和throws的区别:
a. 作用不一样:在throw用于程序抛出异常;throws用于声明在该方法内抛出了异常。
b. 使用的位置不同:throw位于方法体内部,可以作为单独语句使用;throws必须跟在方法参数列表的后面,不能单独使用。
c.内容不同:throw抛出一个异常对象,而且只能是一个;throws后面跟异常类,而且可以跟多个异常类。
3.2 异常分类
Java的异常体系包括许多异常类,它们之间存在继承关系。
Throwable类:所有异常类型都是它的子类。它派生了两个子类,Error和Exception。
Error类:表示仅靠程序本身无法恢复的严重错误。
Exception类:由Java应用程序抛出和处理的非常严重错误。
程序运行异常:RuntimeException及其所有子类,不要求程序必须对它们做出处理。
非运行时异常(CheckedException):除运行时异常外的其他由Exception继承来的异常类程序必须捕获或者抛出这种异常。
4.开源日志记录根据log4j
1.在eclipse中使用log4j
在eclipse中使用log4j的步骤比较简单,主要分四个步骤;
a. 在项目中加入log4j所使用的JAR文件
b.创建log4j.properties文件
c.编写log4j.properties文件,配置日志信息
d.在程序中使用log4j记录日志信息
2.log4j配置文件
2.1输出级别
log4j.rootLogger=debug,stdout,logfile
其中,debug是日志记录器的输出级别,主要的输出级别如下:
fatal:指出严重的错误事件将会导致应用程序的退出。
error:指出虽然发生错误事件,但仍然不影响系统的继续运行。
warn:表明会出现潜在错误的情形。
info:在粗粒度级别上指明消息,强调应用程序的运行过程。
debug:指出细粒度信息事件,对调试应用程序是非常有帮助的。
输出级别的优先级:
fatal>errpr>warn>info>debug
2.2日志输出目的地 Appender
log4j.rootLogger=debug,stdout,logfile
其中,stdout,logfile指日志输出目的地的名字。
log4j可以有多个目的地,一个输出目的地称为一个Appender。常用的Appender有以下两种。
a. ConsoleAppender:输出日志事件到控制台。
b. FileAppender:输出日志到文件。
2.3 日志布局类型Layout
Appender必须使用一个与之相关的布局类型Layout,用来指定它的输出样式。如以下。
a. HTMLLayout:格式化日志输出HTML表格。
b. SimpleLayout:简单格式输出日志
c. PatternLayout:自定义格式输出日志。
2.4 转换模式ConversionPattern
当类型为PatternLayout时,需要配置输出格式,常用配置参数如下:
%d:用来输出日志的日期和时间。
%m:用来输出代码中指定的信息。
%n:用来输出回车换行符。
%l:用来输出日志事件发生的位置。
%p:用来输出优先级。
%F:用来输出文件名。
%M:用来输出方法名。