1.理解异常

  1.1 什么是异常

异常是程序在运行过程中发生的不正常的事件,影响程序的执行。

比如:所需的文件找不到,网络连接中断或不通,算数运算出错,数组小标越界等

  1.2 什么是异常处理

异常处理就是对发生的异常做出的补救措施,一些处理的办法,万一发生异常,使用这些措施保证程序的正常运行。

2.异常处理

  2.1 异常处理的关键字

Try ; catch; finally; throw; throws

 2.2 异常关键字的属性

     1try-catch

A:如果try块中所有语句都正常执行完毕,不会放生异常,那么catch快中的所有语句都会被忽略。

B:如果try快中有异常,并且这个异常与catch块中的异常类型相匹配,将指向catch块中的语句,try异常语句之后的代码将被忽略(跳过)。

C:如果try语句有异常,而抛出的异常在catch块中没有声明,则程序立刻退出。

     2catch快中输出异常信息的方法

Void printStackTrace();输出异常的堆栈信息。

String getMessage(); 返回异常信息描叙字符串。是Void printStackTrace();输出异常的堆栈信息的一个详细部分

     3try-catch-finally

A:无论是否发生异常,finally块中的语句都会被执行。

Btry-catch-finally结构中的块try块是必须的,catchfinally块为可选,但是两者至少出现其中之一。

C:即使try块中有return语句,finally语句也会被执行,执行完finally语句后才会执行try语句或catch语句中的return语句退出方法。

Dfinally块不被执行的唯一情况,在异常处理代码中执行System.exit(1)

     4)多重catch

在一个try语句后面跟多个catch块可以分别处理不同的异常,但是排列顺序必须从子类到父类,最后一般都是Exception类,如果Exception类放在子类的前面,后面子类将不会被执行。

     5)声明异常 throws

Java中通过关键字throws声明某个方法可能抛出的各种异常,throws可以同时声明多个异常,之间用逗号隔开

     6)抛出异常 throw

java中可以使用throw关键字来自行抛出异常

     7throwthrows的区别:

A:作用不同:throw用于在程序中抛出异常;throws用于声明方法内抛出了异常类型

B:使用的位置不同:throw位于方法体内部,可以作为单独语句使用;throws必须跟在方法参数列表后面,不能单独使用。

C:内容不同:throw抛出一个异常对象,而且只能是一个;throws抛出异常类,而且可以是多个异常类。

  3.处理异常的方式

A:通过try-catch捕获并处理异常。

B:通过throws继续声明异常,如果调用者不打算处理该异常,则可以继续通过throws声明 异常类,让上一级调用者处理。Main()方法声明的异常将有java虚拟机来处理。

3.异常的分类

一是:Error

程序本身无法恢复的严重错误。非重点,如虚拟机错误,内存溢出动态链接失败。

二是:Exception

java应用程序抛出和处理的非严重错误,主要包括:运行时异常(RunTimeException)和 非运行时异常(checked

@1:RunTimeException

出现异常仍可以编译和运行 主要包括:

  1.ArithmeticException 算数错误异常类;如除数为0

  2.ArrayIndexOfBoundsException 数组下表越界

  3.)NullPointerException 对象为空(空指针)

  5.InputMismatchException 欲得到的数据类型和实际输入的不匹配

  6.IllegalArgumentException 方法接受到非法的参数,实参类型不对

  7.ClassCastException 对象强制类型转换出错

  8.NumberFormatException 数字格式转换异常 比如把“abc”转换成数字

  9.)ArrayStoreException(数据存储异常,操作数组时类型不一致)

  @2:Checked

非运行时异常类,程序必须捕获或抛出这种异常,否则会出现编译错误,无法通过编译。处理方式包括两种:一,通过try-catch在当前位置捕获并且处理异常;二,通过throws声明抛出异常类,交给上一级调用方法处理。主要包括:

.ClassNotFoundException 不能加载所需要的类

 

4.开源日志记录工作log4j

  4.1 日志记录的分类

SQL日志:记录执行系统执行SQL的语句

异常日志:记录系统运行中发生的异常事件

义务日志:记录系统运行过程,如用户从操作,操作记录

  4.2 使用log4j的步骤

在项目中加入log4j所使用的JAR文件

创建log4j.properties文件

编写log4j.properties文件,在log4j.properties文件里source里面编写,配置日志信息

在程序中使用log4j记录日志信息

  4.3 log4j的使用语法实例

     4.3.1 编写log4j.properties文件:

    #设置logger输出级别和输出目的#

log4j.rootLogger=debug,stout,logFile

#把日志信息输出到控制台#

log4j.appender.stout=org.apache.log4j.ConsoleAppender

log4j.appender.stout.Target=System.err

log4j.appender.stout.layout=org.apache.log4j.SimpleLayout

#把日志信息输出到文件:jbit.log#

log4.appender.logFile=org.apache.log4j.FileAppender

log4.appender.logFile.File=jbit.log

log4.appender.logFile.layout=org.apache.log4j.PatternLayout

log4.appender.logFile.layout.ConversionPattern=%d{YYYY-MM-DD HH:mm:ss}%1 %F %p %m%n

      4.3.2 在程序中使用log4j记录日志信息

package cn.shortAnswer5;

import org.apache.log4j.Logger;

import cn.shortAnswer2.Test;

public class Tset {

public static Logger logger=Logger.getLogger(Test.class.getName());

/**

 * @param args

 */

public static void main(String[] args) {

int[] array=new int[2];

try {

array[2]=5;

} catch (ArrayIndexOutOfBoundsException e) {

System.err.println("数组下标越界");

logger.debug(e);

e.printStackTrace();

}

}

}

 

    4.4 日志的输出级别及属性

Fatal:指严重的错误事件会导致应用程序的退出

error:指虽然发生错误事件,但仍然不影响系统的继续运行。

Warn:表明会出现潜在错误的情形

Info:在粗粒度级别上指明消息,强调程序的运行过程。

Debug:指出细粒度的信息事件,对调试应用程序非常有帮助。

       4.4.1 各个输出级别的优先级:

Fatal>error>warn>info>dubug

       4.4.2 日志输出目的地Appender

Log4j.rootLogger=debug,stdout,logfile

其中stdout,logfile指日志输出目的地的名字,可以随便起。

Log4j日志允许输出到多个目的地,一个输出目的地称为一个Appender,最常用的有两种:

 AConsoleAppender:输出日志到控制台。通过Target属性配置输出到System.outSystem.err,默认是System.out

 BFileAppender;输出日志到一个文件。通过file属性配置文件的路径及名称。

       4.4.3 日志布局类型layout

Appender类必须使用一个与之相关联的布局类型Layout,用来指定它的输出样式,常见的样式有三种:

AHTMLLayout;格式化日志输出为HTML表格。

BSimpleLayout;以一种简单的格式输出,它输出的级别是level,然后跟着一个破折号“-----”最后是日志信息。

CPatternLayout;根据指定的转换格式输出。需要配置layout.ConversionPattern属性,如果没有将会使用默认的转换样式。

      4.4.4 转换模式ConversionPattern

%p: 输出日志信息优先级,即DEBUGINFOWARNERRORFATAL, 
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2011-10-18 22:10:28,921 
%r: 输出自应用启动到输出该log信息耗费的毫秒数 
%c: 输出日志信息所属的类目,通常就是所在类的全名 
%t: 输出产生该日志事件的线程名 
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。 
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。 
%%: 输出一个"%"字符 
%F: 输出日志消息产生时所在的文件名称 
%L: 输出代码中的行号 
%m: 输出代码中指定的消息,产生的日志具体信息 
%n: 输出一个回车换行符,Windows平台为"\r\n"Unix平台为"\n"输出日志信息换行 .