程序在实际环境的执行过程中。安全成为须要首先考虑的重要因素之中的一个。这也是用户和程序猿最关心的问题。同一时候,Java语言健壮性也体如今了可以及时有效地处理程序中的错误。准确的说是Java的异常处理机制为解决安全问题提交了一份惬意的答卷。

先从总体上看一下本文要介绍的内容,然后进行具体的分析:

1、异常的概念

异常又称为例外,是特殊的执行错误对象,相应着Java语言特定的执行错误处理机制。

上面的概念是书本上说的。以下我谈一下自己的看法

事实上异常处理机制提供了统一的机制来识别和响应程序错误。异常能够为我们解答3W(what、where、why)问题提供帮助。

①what

假设异常机制使用恰当,被抛出异常的类型能够表明发生了什么程序错误。

②where

发生异常之后,而Stack Trace能够清楚的告诉我们什么地方发生了错误。

③why

为什么错误发生则能够通过看异常信息和Stack Trace来分析。

假设你的异常不能解决上面的3W问题。那么能够证明你对异常使用一定不对。

2、异常的分类

这张类图能够非常好的说明 Thorwable类是全部异常和错误的超类,有两个子类Error和Exception,分别表示错误和异常。 当中异常类Exception又分为执行时异常(RuntimeException)和非执行时异常,以下将具体讲述这些异常之间的差别与联系:

1.Error与Exception

Error:称为错误。由Java虚拟机生成并抛出,包含动态链接失败、虚拟机错误等。程序对其不做处理,也能够说成不能够处理的异常。

Exception:全部异常类的父类,其子类相应了各种各种详细可能出现的异常事件,一般须要用户声明或捕获,也叫可处理的异常。

2.runtimeException与非执行时异常(其它异常)

runtimeException:一类特殊的异常,如被0除、数组下界超范围。其产生比較频繁。处理麻烦。假设声明或捕获将会对程序可读性和执行效率影响非常大。因此系统自己主动检測并将它们交给缺省的异常处理程序,这种异常能够处理也能够不处理。

非执行时异常:是RuntimeException以外的异常,类型上都属于Exception类及其子类,这类异常是必需要处理的异常,否则程序就不能编译通过。

3、异常的捕获和处理

异常的捕获和处理是不easy把握的事情,假设处理不当。不但会造成程序的可读性差,并且会导致系统的性能下降,甚至会造成难以发现的错误。异常处理涉及到五个keyword:try、catch、finally、throw、throws。以下我们一一介绍:

1、异常处理的基本的语法

     try{
//程序代码
}catch(异常类型 异常的变量名){
//异常处理代码
}finally{
//异常发生,方法返回之前,总是要运行的代码
}

①try语句

1.try语句指定了一段代码,该段代码一次捕获并处理例外的范围。

2.在运行过程中,该段代码可能会产生并抛出异常,catch语句捕获并处理。

3.没有例外产生。全部的catch代码段都被忽略不运行。

②catch语句

1.catch语句是对异常进行处理的代码,每一个try能够有一个或多个catch语句。用于处理可能产生不同类型的异常对象。

       2.在catch中声明的异常对象,封装了异常事件发生的信息,在catch语句块中能够使用这个对象的一些方法获得这些信息。

③finally

1.finally语句为异常处理提供了统一的出口,使得在控制流程转到程序的其它部分曾经,可以对程序的状态做统一的管理。

2.不管try语句是否抛出异常。finally语句都会被运行

3.finally语句能够释放资源如:关闭打开的文件、删除暂时文件等等。

④throw与throws

throw用来在方法体内抛出一个异常。throws用来在方法名后声明方法可能会抛出什么异常。

    public static void test() throws Exception{
//抛出一个检查异常
throw new Exception("方法test中的Exception");
}

2、 异常处理的一般原则

1、 异常能处理就早处理,抛出不去还不能处理的就想法消化掉或者转换为RuntimeException处理。

由于对于一个应用系统来说,抛出大量异常是有问题的,应该从程序开发角度尽可能的控制异常发生的可能。

2、对于异常,先逮小异常再逮大的异常。

由于程序的运行跟人的正常思维是一样。直接捕获基类异常。处理异常变的毫无意义。

4、总结

一张图,对于异常机制更深刻的理解,才干更好的使用。五个keyword是技术的必备武器。你必须得懂。先逮小的,再逮大的,对于异常的处理原则要把握好。否则就是功归一篑。

最新文章

  1. MongoDB命令及SQL语法对比
  2. Mini projects #7 ---- Spaceship
  3. 第一章 第一个spring boot程序(转载)
  4. Qt模型/视图框架----简单的例子
  5. 有没有一行文件字过多后可以省略号显示,我说的不是用其他样式,BT本身有没有?谢谢
  6. Applicationpoolidentity 好有趣哦
  7. 第十二篇、高度自适应的textView
  8. 栈的顺序存储方式的C语言实现
  9. Swift入门教程:基本语法(五)
  10. java note
  11. 《Shell脚本学习指南》学习笔记之自定义函数
  12. CJOJ 2022 【一本通】简单的背包问题(搜索)
  13. 激活IDEA
  14. Node.js模块化教程
  15. node.js学习6---第三方依赖(模块或者说是包)的导入 npm 以及 cnpm命令的使用
  16. 使用xmanager接收图形界面
  17. Elasticsearch 搜索模块之Cross Cluster Search(跨集群搜索)
  18. 【转】Hadoop vs Spark性能对比
  19. BZOJ 50题纪念?
  20. Delphi-Cross-Socket

热门文章

  1. [译]如何在迭代字典的过程中删除其中的某些item(Python)
  2. 下载,配置环境变量,第一个demo
  3. API生命周期第三阶段:API实施模式,以及结合swagger和项目现状的最佳模式
  4. mac上安装chromedriver
  5. WebRTC编译详细介绍 (转)
  6. 使用gcc的-finstrument-functions选项进行函数跟踪【转】
  7. XOCDE5开发
  8. 矢量图和Word:EPS,PDF,EMF和SVG
  9. Codeforces 403D: Beautiful Pairs of Numbers(DP)
  10. AC日记——线段树练习4 codevs 4919