异常

来源:互联网 发布:java split 多个参数 编辑:程序博客网 时间:2024/05/16 01:10

1.异常介绍

1.1概述

异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。

 

传统的处理异常的办法是,函数返回一个特殊的结果来表示出现异常(通常这个特殊结果是大家约定俗称的),调用该函数的程序负责检查并分析函数返回的结果。 这样做有如下的弊端:例如函数返回-1代表出现异常,但是如果函数确实要返回-1这个正确的值时就会出现混淆;可读性降低,将程序代码与处理异常的代码混 爹在一起;由调用函数的程序来分析错误,这就要求客户程序员对库函数有很深的了解。

 

异常处理的流程:

1)        遇到错误,方法立即结束,并不返回一个值;同时,抛出一个异常对象。

2)        调用该方法的程序也不会继续执行下去,而是搜索一个可以处理该异常的异常处理器,并执行其中的代码。

1.2java异常分类

Throwable是所以异常的父类,ErrorException继承Throwable

 

Error体系

Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形。应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出)。如果出现这种错误, 除了尽力使程序安全退出外,在其他方面是无能为力的。所以,在进行程序设计时,应该更关注Exception体系。我们一般称这种异常为:错误(Error)

 

Exception体系:

1.         RuntimeException:包括错误的类型转换、数组越界访问和试图访问空指针等等。处理 RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界 来避免数组越界访问异常。

2.         RuntimeExceptionIOException等等):这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。

3.         我们一般称这种异常为:伪劣(Exception)。

4.         从另一角度来讲,它们又分为编译时异常和运行时异常

1)        编译时异常:在编译时就一定要使用异常机制来处理的异常(操作文件的、网络的、数据库);

2)        运行时异常:只有在运行的过程中才有可能出现的异常,在编译的时候,不强制使用异常机制来处理的异常(空指针、下标越界)

2.异常的语法

2.1throws:声明方法会抛出的异常

方法是否抛出异常与方法返回值的类型一样重要。假设方法抛出异常确没有声明该方法将抛出异常,那么客户程序员可以调用这个方法而且不用编写处理异常的代码。那么,一旦出现异常,那么这个异常就没有合适的异常控制器来解决。

 

抛出的异常一定是已检查异常

RuntimeExceptionError可以在任何代码中产生,它们不需要由程序员显示的抛出,一旦出现错误,那么相应的异常会被自动抛出。而已检查异常是由程序员抛出的,这分为两种情况:客户程序员调用会抛出异常的库函数(库函数的异常由库程序员抛出);客户程序员自己使用throw语句抛出异常。

遇到Error,程序员一般是无能为力的;遇到RuntimeException,那么一定是程序存在逻辑错误,要对程序进行修改(相当于调试的一种 方法);只有已检查异常才是程序员所关心的,程序应该且仅应该抛出或处理已检查异常。

 

一个方法可以使用throws抛出多个异常,异常之间使用逗号分隔。

 

注意:在继承的情况下,覆盖父类中使用throws抛出异常的方法的时候,子类中覆盖的异常不能是父类异常的父类,类型不同可以覆盖。所以,有时设计父类的方法时会声明抛出异常,但实际的实现方法的代码却并不抛出异常,这样做的目的就是为了方便子类方法覆盖父类方法时可以抛出异常。

2.2throw:抛出异常

在方法内,用throw把异常向上抛出(丢给方法的调用者)。这是一种显示地抛出异常,还有一种,当异常发生时,首先在异常发生的方法内部查找,有没有解决方案,如果有,则处理异常;如果没有则通过栈回调,直到找到能处理异常的方案。如果一直向上抛出异常,最后会抛给JVMJVM的处理就是关闭程序。

 

使用系统提供的API类的时候,当调用提供的方法会抛出异常时,我们尽量在本方法中,使用try—catch处理,不要让异常再向上抛。最好不要使用throw抛出异常的方式来处理异常。(捕捉并处理哪些知道如何处理的异常,而传递哪些不知道如何处理的异常

2.3捕获并处理异常

try {

                     //捕获异常

              } catch (Exception e) {

                     //处理异常

                     //1、记录异常信息

                     //2、为了保护数据,就要使用正常的方式退出该程序,让影响降低到最小化

       }finally{

              //释放资源

}

try后可以有多个catch,每个catch只能处理对应的异常事件。若掷出一个异常,异常控制机制会搜寻参数,随后它会进入第一个与异常类型相符的catch 从句,并认为异常已经得到控制。Catch中,异常中的父类是不可以放置到子类的前面,先子类再父类异常,所以在catch最后都会使用Exception异常。

 

trycatchfinally中可以嵌套try-catch异常处理机制,如果不使用嵌套方式,当try中有多行代码的时候,只要某行代码出现异常,该代码后面的代码都不可以运行了

 

finally:由于有了垃圾收集,所以异常处理并不需要回收内存。但是依然有一些资源需要程序员来收集,比如文件、网络连接和图片等资源。

 

如果在本级中,只能处理一部分内容,有些处理需要在更高一级的环境中完成,那么就应该再次抛出异常。这样可以使每级的异常处理器处理它能够处理的异常。

2.4自定义异常

创建自己的异常:当Java内置的异常都不能明确的说明异常情况的时候,需要创建自己的异常。大多数情况下都是继承Exception异常。

 

对于一个异常对象,真正有用的信息是异常的对象类型,而异常对象本身毫无意义。比如一个异常对象的类型是 ClassCastException,那么这个类名就是唯一有用的信息。所以,在选择抛出什么异常时,最关键的就是选择异常的类名能够明确说明异常情况的类。

 

异常对象通常有两种构造函数:一种是无参数的构造函数;另一种是带一个字符串的构造函数,这个字符串将作为这个异常对象除了类型名以外的额外说明。但使用异常带字符串的构造函数时,这个字符串还可以作为额外的信息。调用异常对象的 getMessage()toString()或者printStackTrace()方法可以分别得到异常对象的额外信息、类名和调用堆栈的信息。

 

需要注意的是,唯一有用的就是“类型名”这个信息,所以不要在异常类的设计上花费精力。

3.异常处理原则

1.         异常只能用于非正常情况;

2.         为异常提供说明文档;

3.         尽可能避免异常;

4.         尽可能保持异常的原子性:异常的原子性是指当异常发生后,各个对象的状态能够恢复到异常发生前的初始状况;

5.         避免过于庞大的try代码块;

6.         catch中指定具体的异常类型;

7.         不要再catch中忽略捕获到的异常。

8.         将产生的异常信息记录帮助我们记录产生异常的地方,以及是在什么情况下产生的异常,这样就为他们维护该系统提供服务(记录在文件中,使用DB存储)

 

 

PS:继续笔记

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 vivo手机下载吃鸡不兼容怎么办 vivox3t不兼容支付宝怎么办 移动sim卡坏了怎么办 cpu和主板不兼容怎么办 主板与cpu不兼容怎么办 cpu跟主板不兼容怎么办 软件与电脑不兼容怎么办 win8系统无限重启怎么办 安装微信旧版本登录提示升级怎么办 手机软件与系统不兼容怎么办 下载旧版本微信闪退登陆不了怎么办 企业微信一直登录失败怎么办 360浏览器9.1经常卡死怎么办 手机版爱奇艺看电影屏幕变小怎么办 找不到旧版本米聊怎么办 苹果id被锁了怎么办 新浪微博支付宝解绑失败怎么办 阿里妈妈升级看不到引流人数怎么办 阿里妈妈账号被冻结怎么办 微博昵称到次数怎么办 五星好评之后忘记截图了怎么办 评价后忘了截图怎么办 好评率太低不能买东西了怎么办 淘宝评价被删了怎么办 淘宝店铺有流量没有成交怎么办 淘宝好评被删了怎么办 淘宝评论被系统删除怎么办 淘宝被商家删除评价怎么办 淘宝评价管理商家删除了怎么办 淘宝商家删除评价我该怎么办 我的评价隐藏了怎么办 淘宝把评论删了怎么办 淘宝虚假交易被删除评价怎么办 淘宝好评评错了怎么办 被淘宝骗了好评怎么办 美团好评被删了怎么办 卖家收到好评内容是差评怎么办 淘宝收货电话写错了怎么办 淘宝评价写错了怎么办 饿了么商家差评怎么办 淘宝不给补差价怎么办