1、什么是异常

结构不佳的代码不能运行,这是Java的基本理念。

发现错误的理想时机是在编译期。然而,编译器并不能发现所有的错误,余下的问题就需要在程序运行时解决。这就需要错误能通过某种方式,把适当的信息 传递给特定的接收者处理。Java中的异常处理的目的在于通过使用少量的代码来简化大型、可靠的程序的生成,通过此方式让你的应用中没有未处理的错误,而 且它还带来了一个明显的好处:降低错误处理代码的复杂度。

异常,根据字面理解,有意外之意。把它置于代码层面来理解,即阻止了当前方法或作用域继续执行。

在Java中,异常被当做对象来处理,其基类是Throwable。

2、Java中的异常类型

Java从Throwable直接派生出Exception和Error。其中Exception是可以抛出的基本类型,在Java类库、方法以及运行时故障中都可能抛出Exception型异常。Exception表示可以恢复的异常,是编译器可以捕捉到的;Error表示编译时和系统错误,表示系统在运行期间出现了严重的错误,属于不可恢复的错误,由于这属于JVM层次的严重错误,因此这种错误会导致程序终止执行。Exception又分为检查异常和运行时异常。

异常类的结构层次图如下:

典型的RuntimeException(运行时异常)包括NullPointerException, ClassCastException(类型转换异常),IndexOutOfBoundsException(越界异常), IllegalArgumentException(非法参数异常),ArrayStoreException(数组存储异常),AruthmeticException(算术异常),BufferOverflowException(缓冲区溢出异常)等;

非RuntimeException(检查异常)包括IOException, SQLException,InterruptedException(中断异常-调用线程睡眠时候),NumberFormatException(数字格式化异常)等。

而按照编译器检查方式划分,异常又可以分为检查型异常(CheckedException)和非检查型异常 (UncheckedException)。Error和RuntimeException合起来称为UncheckedException,之所以这么 称呼,是因为编译器不检查方法是否处理或者抛出这两种类型的异常,因此编译期间出现这种类型的异常也不会报错,默认由虚拟机提供处理方式。除了Error 和RuntimeException这两种类型的异常外,其它的异常都称为Checked异常。

3、Java如何处理异常

3.1 try-catch, try-finally, try-catch-finally

对于checked类型异常,我们要么对它进行处理,要么在方法头使用throws抛出。public static void createFile() throws IOException{

File file = new File("C:/test.txt");

if(!file.exists()){

file.createNewFile();

}

}

public static void main(String[] args) {

try {

createFile();

} catch (IOException ex) {

// handle exception here

}

}

关于catch需要注意的几点:

1)、参数的异常类型必须是Throwable类或者其子类。

2)、从上往下的catch语句,其参数类型必须按照从子类到父类顺序,因为一旦匹配到一个类型,就会忽略往后的catch。比如IOException必须放到Exception前面,否则编译器会报错。

3)、可以有一个或者多个catch语句,甚至如果有finally语句的情况下,可以没有catch语句,如try-finally。

想要捕获多个异常,可以使用多个catch语句,JDK7以后提供了另外一种方式:多重捕获(multi-catch)。try{

// other code

} catch (IOException | SQLException ex) {

throw ex;

}

4)、不要忽略异常。空的catch块会使异常达不到应有的目的,除非诸如关闭FileInputStream的时候,因为你还没有改变文件的状态,因此不必执行任何恢复动作,并且已经从文件中读取到所需要的信息,因此不用终止正在进行的操作。

关于finally需要注意的几点:

1)、finally中的代码总是会被执行,除非在执行try或者catch语句时虚拟机退出(System.exit(1))。

2)、finally块可以做一些资源清理工作,如关闭文件、关闭游标等操作。

3)、finally块不是必须的。

另外,如果在try和finally块中都执行了return语句,最终返回的将是finally中的return值。

3.2 异常链

常常想要在捕获一个异常后抛出另外一个异常,并且希望把原始异常信息保存下来,这就是异常链。在JDK1.4以后,Throwable子类在构造器 中可以接受一个cause对象作为参数,表示原始异常,通过这样把原始异常传递给新的异常,使得即使在当前位置创建并抛出了新的异常,也能通过这个异常链 追踪到异常最初发生的位置。

但在Throwable子类中,只有Error, Exception, RuntimeException三类异常类提供了带cause参数的构造器,其它类型的异常则需要通过initCause()方法。例如定义了CustomException类,可以这样使用:CustomException cmex = new CustomException();

cmex.initCause(new NullPointerException);

throw cmex;

这样一来,CustomException继承自Exception或RuntimeException,就属于自定义异常了。

一般来说,自定义异常的作用有以下情形:

1)、将检查型异常转换为非检查型异常。

2)、在产生异常时封装上下文信息、定义异常码、收集环境对象,有利于信息的传递。

4、异常使用指南

1)、在知道该如何处理的情况下才捕获异常。

2)、自定义异常类型,用以封装所有的检查型异常。

3)、在程序的边界进行异常捕获。如服务端相应客户端的请求,在出口处catch内部有可能产生的异常,并统一throw一个封装过的异常给客户端,免得暴露服务端敏感信息。

4)、只针对异常的情况才使用异常。不要在所有的代码中习惯性地使用try-catch,因为这会影响性能。

5)、抛出与抽象相对的异常。如果方法抛出的异常与它执行的任务没有明显的联系,这种情形会使人不知所措。为了避免这个问题,更高层的实现应该捕获 低层的异常,同时抛出可以按照高层抽象进行解释的异常,这种做法被称为异常转译(exception translation),如下:try{

// use lower-level abstraction to do our bidding

} catch(LowerLevelException ex){

throw new HigherLevelException(...);

}

另外一种特殊的异常转译称为异常链,上面已作描述。如果低层的异常对于调试导致高层异常的问题非常有帮助,使用异常链就很合适。高层的异常提供访问方法(Throwable.getCause)来获得低层的异常。

6)、每个方法抛出的异常要有文档描述。利用Javadoc的@throws标记,记录抛出每个异常的条件。如果一个方法可能抛出多个异常,不要使 用这些异常类的某个超类。如不要声明一个方法“throws Exception”或“throws Throwable”,这将没有任何指导信息。

exception 类 java_Java 常见异常种类相关推荐

  1. Java常见异常种类及产生原因

    Java常见异常种类及产生原因 JAVA异常共分为下列几种 Error JAVA环境编译错误 Runtime Exception 运行处异常 Exception 标准Java库方法异常 throw 用 ...

  2. Java 常见异常种类

    Java 常见异常种类 参考文章: (1)Java 常见异常种类 (2)https://www.cnblogs.com/cvst/p/5822373.html 备忘一下.

  3. JAVA常见异常种类

    Java类库的每个包中都定义了异常类,所有这些类都是Throwable类的子类,Throwable类属于java.lang包,每个java程序运行时系统会自动引入此包:Throwable类有两个子类, ...

  4. java中三种可能导致异常的情况_Java常见异常种类及产生原因

    JAVA异常共分为下列几种 Error JAVA环境编译错误 Runtime Exception 运行处异常 Exception 标准Java库方法异常 throw 用户自定义异常 异常分为两类 Er ...

  5. e-mobile帐号状态存在异常_Java 常见异常种类

    Java Exception: 1.Error 2.Runtime Exception 运行时异常 3.Exception 4.throw 用户自定义异常 异常类分两大类型:Error类代表了编译和系 ...

  6. java异常(机制和捕捉(常见异常类))详解 +练习题

    Java 中的异常处理机制 1.什么是异常 异常:程序在运行过程中产生的不正常情况. 程序在运行的时候,发生了一些不被预期的事件,从而没有按照我们编写的代码执行,这就是异常. 异常是Java中的错误, ...

  7. JAVA常见异常信息(保存)

    一. java基础编程中常见的错误(基本类型) 包装类型参与运算时,要做null值校验,否则可能出现空指针异常. 包装类型比较大小,不能使用compare(i,j)直接比较,因为该方法是用来比较基本类 ...

  8. python中exception类的_什么是Python异常?Python异常的种类

    程序中难免出现错误,而错误分成两种 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正)#语法错误示范一 if #语法错误示范二 def test: pass 2. ...

  9. 1.1 Java异常(Exception)处理及常见异常

    计算机程序的编写也需要考虑处理这些异常情况.异常(exception)是在运行程序时产生的一种异常情况,已经成为了衡量一门语言是否成熟的标准之一.目前的主流编程语言,如 C++.c#.Ruby 和 P ...

最新文章

  1. 小程序商城制作,轻松打造自己的会员系统
  2. 数字图像处理中所用数学工具3---算术操作处理图像
  3. Hiberate--one to many
  4. stm32编码器正反转计数程序_光电编码器接线图分析
  5. LaTeX表格字太贴近上面表线
  6. 《Java程序员职场全攻略:从小工到专家》连载十五:我们不是爱加班
  7. unity3d自己写角色移动脚本
  8. (我总结的实用主义)Loadrunner运行常见错误
  9. emu8086汇编——字符串匹配算法程序
  10. 主要几个浏览器的内核是什么
  11. 如何使用Nginx Ingress实现灰度发布和蓝绿发布?
  12. Accuracy(精度)、Precision(精准度)和Recall(召回率)
  13. 声明式导航与编程式导航
  14. 【安卓开机启动】安卓JVM加载so库流程
  15. SQL查询JSON格式的字段值 JSON_UNQUOTE与JSON_EXTRACT 去除SQL中双引号
  16. 多元正态分布的性质和定理
  17. 你的孩子,未来20年将面临怎样的阶层分化?
  18. 六、朴素贝叶斯案例分析
  19. vue3项目使用自定义字体font-family
  20. 排序(下)---快排、归并

热门文章

  1. 技嘉b365dv3主板黑苹果efi_【ITX小钢炮】黑苹果安装经验分享
  2. java七大排序算法代码
  3. SharePoint 2013 CSOM 对象模型属性包
  4. 【Python爬虫】猫眼电影榜单Top100
  5. datatable 每页显示多少条 放到表格下面
  6. Visual Studio Code (VSCode)使用之普通Web项目启动
  7. webview加载pdf
  8. ARM指令集历史V1-V8
  9. Endnote X7导入中文文献时,出现信息不全
  10. 直播系统开发中如何优化API接口的并发