用try和catch捕捉异常
- 程序在运行的过程中难免会出错,类似于生活中的突发事件.
- 如果错误不处理,则错误会抛向虚拟机.最终导致程序退出,影响用户体验.
- 如果在程序中不断对参数进行判断,则代码会过于膨胀,让程序无法专心于业务代码
- 运行时出现的错误叫做异常,Exception,有些地方如台湾也翻译为例外.
- 通过try-catch 可以捕捉异常
try{
//可能出现的异常
}catch(Exception ex){
//异常被捕捉后,进入catch块中处理异常.
}
6.try包含的是可能发生的异常,但不是说一定会有异常.
7.try包含的代码不说越多越好.
8.异常发生后,会进入catch中,则try里面的代码会中断
9.catch中的Exception 对象是捕捉到异常对象: a.printStackTrace() 输出异常的详细信息 b.getMessage()获得关键的异常消息.
10.异常被捕捉后,程序就不会异常中断了.
11.finally是可选的,但是如果有,则表示最后肯定会执行的语句块,通常用于释放资源,收尾.
throw 和throws
- 抛出异常 a.如果出现导致异常的情况,而自身不想处理或者无法处理,可以手动抛出一个异常 b.new Exception()表示构建异常对象,可以在构造函数中填写异常说明信息 c.通过throw 关键字将异常抛出,表示制造一个异常现象,即在当前环境就不要操心这个问题了. d.此举本质是要把错误信息,报告给方法的调用者即更高一层,它们可能有办法来处理. e.编写一个未满18岁不能进入网吧的例子,否则抛异常.
- 异常说明 a.如果方法内显示抛出异常 b.或者方法内调用了可能抛出异常的方法 c.为了明确告知方法的调用者这个方法可能抛出异常,可以使用throws声明此方法可能抛出的异常. d.throws 用于告知调用者 可能出现的异常,是一个良好的编程习惯. e.写在方法签名的末尾,多个异常可以用逗号隔开.
异常的分类
- 异常的类型有很多,他们之间也有层级
- Throwable类: 所有异常类型都有Throwable类的子类,它派生两个 即Error 和Exception
- Error类: a.Error往往是很严重的错误,是程序无法处理的异常 b.可以捕获但是最好不要捕获,因为捕获了也解决不了 c.比如内存溢出(outofMemoryError),线程死亡(ThreadDeath)等 d.程序员通常更关注Exception类
- Exception类:是程序本身可以处理的异常,即非严重错误. a.运行时异常RuntimeException:不要求程必须做出处理 ArithmaicException NullpointerException NumberFormatException classcastException IndexoutofBoundsException IllegalArgumentException InputMismatchException
- checked 异常(非运行时异常):除了运行时异常外的其他继承自Exception类的子类异常 i.也叫受查异常或者检查异常 ii.程序必须捕获或者抛出这种异常.否则会出现编译错误 IOException SQLException classNotFoundException
自定义异常
- 系统提供的异常类毕竟有限,不能完全满足我们的需求
- 可以自定义异常类实现自身需求
- 可以选择继承自Exception 类编写自定义受检查异常
- 也可以继承RuntimeException 类编写非受检查异常
- 通常会在自定义异常类中调用父类的带参构造方法来初始化异常信息
- 异常类的名称很重要,通常用于暗示错误信息
多重catch和方法重写时throws处理
- 多重catch a.异常有多种类型,捕捉异常的时候,可以根据不同的异常类型来分别做出不同处理 b.其中一个匹配成功,其他的catch块则忽略 c.父类异常要写在后面,因为父类异常范围大d.如果没有一个捕捉得到,则异常继续向外抛出
- try-finally 也可以联用,目的是为了异常出现后,可以通过finally释放资源.
- 受查异常不能随意捕捉,如果没有声明抛出受查异常的代码,则不能捕捉,Exception和Throwable除外.
即下面的代码不能通过:
try{
int a=4;
}catch(Exception e){
}
4.子类重写父类方法时,如果父类方法有throws异常 a.重写方法一定不能抛出新的检查异常 b.不能比被重写方法申明更加宽泛的检查型异常 c.对于非受查异常则不做要求.
log4j日志组件
- 异常信息以及程序的重要操作需要记录日志log.
- 日志信息以便日后查错找bug,分析统计等功能.
- 日志根据记录的内容不同,主要分为三类: a.SQL日志,记录sql语句 b.异常日志,记录异常信息 c.业务日志,记录系统运行过程,比如用户登录,操作记录.
- 使用第三方成熟的日志组件:log4j,属于Apache组织,免费开源,可在其官网下载.
- 导入log4j的jar包.
- 在src下新建配置文件log4.properties.
- *.properties:资源文件,属性文件 a.本质就是一个普通的文本文件 b.里面的编写格式是key=value,一行一个 c.注释用#好开头,没有多行注释 d.中文乱码的话需要在eclipse中设置文件的编码.
- 日志输出级别:DEBUG,INFO,WARN,ERROR,FATAL.
- 日志输出目的地Appender a.consoleAppender 目标是system.out.即控制台 b.FileAppender.
- 日志布局类型Layout.常用的是patternLayout.支持丰富多样的输出格式.
- 上面的布局类型需要结合转换模式conversionPattern一起使用.