异常

异常

一、异常概述

1、程序中的异常

通过if-else语句进行异常处理的机制主要有以下缺点

1、代码臃肿,加入了大量的异常情况判断和处理代码。

2、程序员把相当多的精力放在了处理异常代码上,放在了“堵漏洞”上,减少了编写业务代码的时间,必然影响开发效率。

3、很难穷举所有的异常情况,程序仍旧不健壮

4、异常处理代码和业务代码交织在一起,影响代码的可读性,加大日后程序的维护难点

2、什么是异常

异常就是在程序的运行过程中所发生单的不正常的事件

二、异常处理

1、什么是异常处理

异常处理机制就像我们对平时可能会遇到的意外情况,预先想好了一些处理的办法。也就是说。在程序执行代码的时候,万一发生了异常,程序会按照预定的处理方法对异常进行处理,异常处理完毕之后,程序继续运行。

Java的异常处理是通过五个关键字来实现的:try、catch、finally、throw和throws。

2、try-catch块

用Java的异常处理机制进行处理,把可能出现异常的代码放入try语句块中,并使用catch语句块捕获异常。

try-catch程序块的执行流程比较简单,首先执行的是try语句块中的语句,这是可能会有以下三种情况

1、如果try块中所有语句正常执行完毕,不会发生异常,那么catch块中的所有语句都将会被忽略

2、如果try语句块在执行过程中遇到异常,并且这个异常与catch中声明的异常类型相匹配,那么在try块中其余剩下的代码都将被忽略,而相应的catch块将会被执行。匹配是指catch所处理的异常类型与所生成的异常类型完全一致或是它的父类

3、如果try语句块在执行过程中遇到异常,而抛出的异常在catch块里面没有被声明,那么程序立即退出。在catch块中可以加入用户自定义处理信息,也可以调用异常对象的方法输出异常信息,常用的方法主要有以下两种。

1.void printStackTrace():输出异常的堆栈信息。堆栈信息包含程序运行到当前类的执行流程,它将输出从方法调出处到异常抛出处的方法调用序列

2.String getMessage():返回异常信息描述字符串。该字符串描述异常产生的原因,是printStackTrace()方法输出信息的一部分

常见的异常类型如下:

异常说明
Exception异常层次结构的根类
ArithmeticException算术错误情形,如以零作除数
ArrayIndexOutOfBoundsException数组下标越界
NullPointerException尝试访问null对象成员
ClassNotFoundException不能加载所需的类
InputMismatchException欲得到的数据类型与实际输入的类型不匹配
IllegalArgumentException方法接收到非法参数
ClassCastException对象强制类型转换出错
NumberFormatException数字格式转换异常,如把“abc”转换成数字
3、try-catch-finally块

在try-catch语句块后加入finally块,把该语句放入finally块,无论是否发生异常,finally块中代码总能被执行

try-catch-finally程序块的执行流程大致分为两种情况

1、如果try块中所有语句正常执行完毕,那么finally块就会被执行

2、如果try语句块在执行过程中碰到异常,无论这种异常能否被catch块捕获到,执行finally块中的代码

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

需要特别注意的是,即使在try块和catch块中存在return语句,finally块中语句也会被执行。发生异常时的执行顺序:执行try块或catch中return之前的语句,执行finally块中的语句,执行try块或catch中的return语句退出

finally块中语句不被执行的唯一情况:在异常处理代码中执行System.exit(1),将退出Java虚拟机

4、多重catch块

当运行时,系统从上到下分别对每个catch语句块处理的异常类型进行检测,并执行第一个与异常类型匹配的catch语句。执行其中的一条catch语句之后,其后的catch语句都将被忽略

注要:在使用多重catch块时,catch块的排列顺序必须是子类到父类,最后一个一般都是Exception类

5、声明异常—throws

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

抛出异常,可以采用以下两种方式进行处理:

1、通过try-catch捕获并处理异常

2、通过throws继续声明异常。如果调用者不打算处理异常,则可以继续通过throws声明异常,让上一级调用者处理异常。main()方法声明的异常将由Java虚拟机来处理

三、抛出异常

1、抛出异常—throw

在Java语言中,可以使用throw关键字来自行抛出异常。抛出一个异常,抛出异常的原因:由于在当前环境中无法解决参数问题,因此在方法内通过throw抛出异常,把问题交给调用者去解决

throw和throws的区别表现在以下三个方面

1、作用不同:throw用于在程序中抛出异常;throws用于声明在该方法内抛出了异常

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

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

2、异常的分类

Throwable类:所有异常类型都是Throwable类的子类,它派生两个子类,即Error和Exception。

Error类:表示仅靠程序本身无法恢复的严重错误

Exception类:由Java应用程序抛出和处理的非严重错误

运行时异常:包含RuntimeException及其所有子类,不要求程序必须对它们做出处理

Checked异常(非运行时异常):除了运行时异常外的其他由Exception继承来的异常类

四、开源日志 记录工具log4j

1、日志及分类

日志根据记录内容的不同,主要分成以下三类。

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

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

3、业务日志:记录系统运行过程,如用户登录、操作记录

2、log4j配置文件
1.输出级别

log4j.rootLogger=debug,stdout,logfile

其中,debug指的是日志记录器(Logger)的输出级别,主要输出级别及含义如下

1、fatal:指出严重的错误事件将会导致应用程序的退出

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

3、warn:表明会出现潜在错误的情形

4、info:在粗粒度级别上指明信息,强调应用程序的运行过程

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

各个输出级别优先级:

fatal>error>warn>info>debug

日志记录器(Logger)将只输出那些级别高于或等于它的信息。

2.日志输出目的地Appender

log4j.rootLogger=debug,stdout,logfile

其中,stdout、logfile指的是日志输出目的地的名字

log4j允许记录日志到多个输出目的地,一个输出目的地被称为一个Appender。log4j中最常用的Appender有以下两种。

ConsoleAppender:输出日志事件到控制台。通过Target属性配置输出到System.out或System.err,默认的目标是System.out

FileAppender:输出日志事件到一个文件。通过File属性配置文件的路径及名称

3.日志布局类型Layout

Appender必须使用一个与之相关的布局类型Layout,用来指定它的输出样式。log4j中最常用的Layout有以下三种

1.HTMLLayout:格式化日志输出为HTML表格

2.SimpleLayout:以一种非常简单的方式格式化日志输出,它输出级别Level,然后跟着一个破折号”—“,最后是日志消息

3.PatternLayout:根据指定的转换模式格式化日志输出,从而支持丰富多样的输出格式。需要配置layout.ConvertsionPattern属性,若没有配置该属性,则使用默认的转换模式

4.转换模式ConversionPattern

对于PatternLayout,需要配置layout.ConversionPattern属性,常用的配置参数及含义如下。

1、%d:用来设置输出日志的日期和时间,默认格式为ISO8601.也可以在其后指定格式,比如%d{yyyy—MM—dd HH:mm:ss},输出格式类似于2016-03-09 17:51:08

2、%m:用来输出代码中指定的信息

3、%n:用来输出一个回车换行符

4、%l:用来输出日志事件的发生位置,包含类名、发生的线程,以及在代码中的行数

5、%p:用来输出优先级,即debug、info、warn、error、fatal等

6、%F:用来输出文件名

7、%M:用来输出方法名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值