• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > 深入理解java异常处理机制的原理和开发应用

深入理解java异常处理机制的原理和开发应用

作者:zju_jzb 字体:[增加 减小] 来源:互联网 时间:2017-05-28

zju_jzb 通过本文主要向大家介绍了java异常处理机制,java中异常处理机制,简述java异常处理机制,java 异常机制,java中的异常机制等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

  Java异常处理机制其最主要的几个关键字:try、catch、finally、throw、throws,以及各种各样的Exception。本篇文章主要在基础的使用方法上,介绍了如何更加合理的使用异常机制。 

try-catch-finally

    try-catch-finally块的用法比较简单,使用频次也最高。try块中包含可能出现异常的语句(当然这是人为决定的,try理论上可以包含任何代码),catch块负责捕获可能出现的异常,finally负责执行必须执行的语句,这里的代码不论是否发生了异常,都会被执行。

    针对这部分,因为很基础,所以就提几点比较关键的建议:

      1、当你在写try-catch语句的时候,脑子里是知道自己要去针对哪种异常进行处理的,不要只是以防万一,加了个catch(Exception e),这是毫无意义的。并且,一个try块中可能有多个异常,对于每一类异常,要分别写一个catch进行捕获。       

      2、针对可能出现异常的语句进行try-catch,大段代码的try-catch会非常不利于维护代码时定位异常可能发生的位置,对于肯定不会发生异常的稳定的代码,不需要放在try块中。

      3、try-catch虽然在功能上,可以成为流程控制的工具,达到条件分支的效果。但相比于if-else语句,java的异常处理机制基于面向对象的思想,使用过程中需要更多的时间与空间的开销,所以不要用异常机制去做基本的条件判断,只有在程序会因为异常而中断时进行捕获和处理。

      4、finally块中永远不要写return语句,因为finally块中总是最后执行,他会改变预期在try和catch块中的返回值(举个例子,你在catch中捕获了一个异常并抛出e,又在finally语句中return true,这样你抛出的异常就"消失"了,因为当前函数的执行结果已经从抛出异常 转变成 return true)。另外,在使用资源对象与流对象时,finally块必须对资源对象、流对象进行关闭。

Java异常体系结构

    Java异常体系的基类是Throwable,它主要有两个子类:Error 和 Exception。其结构如下图:

      

    上图中,Error是指程序无法处理的错误,多指系统内部比较严重的错误。大多数这类错误与开发人员无关,我们关注的主要是Exception。

    Exception主要分为两块:运行时异常和非运行时异常。RuntimeException及其子类都称为运行时异常;除此之外, 所有Exception的子类异常都是非运行时异常。

    运行时异常多指程序逻辑上出现问题(也就是我们自己写代码逻辑出了问题),常见的错误包括 ClassCastException:类型转换异常、NullPointerException:空指针异常、IndexOutOfBoundsException:越界异常...这些异常都可以通过程序逻辑处理来避免(比如加一个判断语句判断是否越界、是否属于某类型、是否为null),所以编译器把这些工作交给了程序员来把控,在编译期即使手动抛出了一个运行时异常不去捕获,编译器也会通过。因而这类异常也叫做"未检查异常"(uncheck)。同样属于未检查异常的还有所有的Error。即上图中,所有蓝色框表示未检查异常,橙色框表示"检查异常"(check)。对于检查异常,在可能发生异常的位置需要用try-catch块去捕获并处理,如果不处理它,就会一直向上层调用抛出,直到被处理为止。

throw 与 throws

    throws关键字主要在方法签名中使用,用于声明该方法可能抛出的异常。throws 可以理解成是一种通知行为,没有实际的抛出异常的动作,而仅仅是告诉调用他的上层函数,这里可能会抛出这个异常;

    throw用于在函数体内语句中,表示抛出一个实际的异常的实际动作,如果在函数内没有捕获并处理,那么将会一直向上抛出这个异常直到被main()/Thread.run()抛出。

    当一个函数throws声明函数可能抛出一个非运行时异常(检查异常)时,那么即使这个函数内部不显示使用throw,调用它的上层函数也必须包含处理这个异常的代码。举个例子:

public class Main {

    public static void main(String[] args){

        exceptionTest();
    }
    static int exceptionTest() throws IOException {
       
        return 0;   
    }
}   

上述代码中调用的exceptionTest函数声明抛出一个IOException属于检查异常,哪怕exceptionTest函数中不可能抛出这个异常,调用它的函数也必须对此异常做出捕获处理。现在main函数中没有相关的处理逻辑,所以会编译错误,如下图:

    而对运行时异常,就是另一种情况了:

public class Main {
 
 public static void main(String[] args){
 
 int i = divideTest(0);
 System.out.println(i);
 }
 static int divideTest(int b) throws ArithmeticException { 
 
 int i = 5/b;
 return i; 
 }
 }
</div>

    同样在main函数没有处理异常的逻辑,这次声明抛出的异常是ArithmeicException,他属于运行时异常(RuntimeException),所以编译器对声明的抛出置之不理:

 

  

  虽然编译期通过,但在运行时程序仍然会自动抛出运行时异常,并一直向上抛出到Main函数。而Main()中没有对该异常的捕获处理,所以主线程终止。

    结论:我目前的理解是,throws一个运行时异常是没有任何实际意义的,除非你为了遵循某个统一的规范而这样做。throws 存在的意义主要是将可能的非运行时异常交给编译器把关,让编译器监督开发人员对这些异常进行捕获处理。

    另外,当你需要自定义一个异常时,如果需要在编译期检查,并在上层统一处理,那么直接继承Exception成为一个检查异常;如果不需要编译期检查,抛出异常表示程序异常需要直接中断,那么继承RuntimeException成为一个运行时异常即可。

              希望本篇文章可以对各位朋友有所帮助!

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 深入理解java异常处理机制的原理和开发应用
  • 深入理解java异常处理机制的原理和开发应用

相关文章

  • 2017-05-28老生常谈java垃圾回收算法(必看篇)
  • 2017-05-28spring之Bean的生命周期详解
  • 2017-05-28老生常谈java中的数组初始化
  • 2017-05-28详解Http请求中Content-Type讲解以及在Spring MVC中的应用
  • 2017-05-28springboot整合spring-data-redis遇到的坑
  • 2017-05-28Spring Boot 基于注解的 Redis 缓存使用详解
  • 2017-05-28详解在Spring Boot中使用JPA
  • 2017-05-28详解Spring AOP 拦截器的基本实现
  • 2017-05-28详解Spring MVC自动为对象注入枚举类型
  • 2017-05-28mybatis教程之查询缓存(一级缓存二级缓存和整合ehcache)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • java 算法之归并排序详解及实现代码
    • Java Timezone类常见问题_动力节点Java学院整理
    • java 中ThreadPoolExecutor原理分析
    • 详解在Spring Boot中使用JPA
    • 详解spring中使用solr的代码实现
    • SWT(JFace) Wizard(Eclipse插件编程必备)
    • Java 多线程有序执行的几种方法总结
    • 详解使用JavaCV/OpenCV抓取并存储摄像头图像
    • 微信开发准备第二步 springmvc mybatis项目结构搭建
    • java编译时与运行时概念与实例详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有