异常概述
程序在运行中总会面临一些“意外”情况,良好的代码需要对它们进行预防和处理。大致来说,这些意外情况分三类:
交互输入
用户以非预期的方式使用程序,比如非法输入,不正当的操作顺序,输入文件错误等。软件和硬件环境问题
文件不存在,文件格式错误,网络问题,存储空间不足,需要的预安装库不存在,系统版本不匹配等。代码错误
使用的其它代码可能的执行错误,如调用了有关数学计算的方法中执行了除0操作等。
发现异常和处理异常都是困难的,需要非常严谨的代码。实际上,程序总是分层或分模块的,往往发生异常的地方和最终调用的地方“相距”甚远。而且,异常的处理有时需要通知用户,甚至需要用户来决定接下来的动作。又或者,程序运行在“后台”,对错误的只能是记录措施。异常发生后,有的情况是需要从错误的状态中恢复再继续执行,又或者是保存状态然后终止执行等。
有关异常的发现和预防是一个具体问题具体对待的经验之谈。对于异常处理框架,关键包括异常的表示、传递和捕获。接下来我们结合Java提供的异常处理机制来学习下如何在正常的程序逻辑中加入异常处理的代码。
Java中的异常处理机制
异常信息是为了通知更上层的方法调用者有关意外的情况,所以它有一个随方法调用栈向上传递的过程,异常信息会像返回值那样被层层上传,直到有方法处理它。
作为面向对象语言,Java提供给我们的几乎都是类、接口这些编程元素。异常处理也不例外,Java并不选择使用返回值来表示异常信息(因为有时返回值无法表达异常情况,而且会搞乱正常的返回值含意,想象下返回任意int值的方法。你依然可以对返回值做很多约定,使用参数来携带异常信息也是受限的),而是定义了Throwable相关的类层次来表示异常。这样可以保证正常代码执行的简明流程,而“异常发生”后将产生一个Throwable对象并随着调用栈向上传递,对应方法立即退出,没有任何返回值,调用方法的代码收到异常后继续退出并上传到更上层方法调用,或者捕获此异常。
接下来就依次来了解下Java异常框架提供的异常表示、传递和捕获处理相关的实现细节。
异常表示:Throwable继承层次
Java中的“异常”基类是Exception,表示可以被方法调用代码处理的可恢复意外情形的“异常信息”。它又继承自Throwable,Throwable是JVM可以throw(后面会讲到)的所有类的基类,用来随着方法调用栈向上传递表示产生此对象的方法的执行环境的信息,封装了一个字符串描述以及方法的调用栈信息。它的另一个子类是Error,它只能由Java运行时本身错误时被创建,我们的app不要去继承它,也无法处理它。
接下来所谈及的异常都是Exception的子类,不涉及Error。

Throwable类提供了有关异常的文本描述和调用堆栈:
延伸阅读
- ssh框架 2016-09-30
- 阿里移动安全 [无线安全]玩转无线电——不安全的蓝牙锁 2017-07-26
- 消息队列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 论文笔记【图片目标分割】 2017-07-26
- 词向量-LRWE模型-更好地识别反义词同义词 2017-07-26
- 从栈不平衡问题 理解 calling convention 2017-07-26
- php imagemagick 处理 图片剪切、压缩、合并、插入文本、背景色透明 2017-07-26
- Swift实现JSON转Model - HandyJSON使用讲解 2017-07-26
- 阿里移动安全 Android端恶意锁屏勒索应用分析 2017-07-26
- 集合结合数据结构来看看(二) 2017-07-26
学习是年轻人改变自己的最好方式