Java中的异常处理:何时抛出异常,何时捕获异常?

2017-06-07

1 异常分类

Throwable对象可以分为两组:

  • 一组是unchecked异常,异常处理机制往往不用于这组异常,包括:

    • Error类通常是指Java的内部错误以及如资源耗尽的错误。当Error(及其衍生类)发生时,我们不能在编程层面上解决Error,所以应该直接退出程序。
    • Exception类有特殊的一个衍生类RuntimeException。RuntimeException(及其衍生类)是Java程序自身造成的,也就是说,由于程序员在编程时犯错。RuntimeException完全可以通过修正Java程序避免。比如将一个类型的对象转换成没有继承关系的另一个类型,即ClassCastException。这类异常应该并且可以避免。
  • 另一组是checked异常。这些类是由编程与环境互动造成程序在运行时出错。比如读取文件时,由于文件本身有错误,发生IOException。

2 异常处理机制

异常处理机制try...catch...finally...,代码如下:

        try {
//可能会有异常的代码
} catch (Exception e) {
//处理异常或抛新的异常
}
finally
{
//释放资源
}

2.1 编译器对checked、unchecked异常的处理

对于checked异常,若方法声明里面没有throws,编译器会报错。当然,若用try...catch...来捕获处理或抛错异常就不需要在方法申明中添加throws异常。如下代码所示:

    public static void CheckedException() throws FileNotFoundException
{
String NotExistedFilePath="D:/abc.txt";
File inFile = new File(NotExistedFilePath);
FileReader fileReader = new FileReader(inFile);
} public static void CheckedExceptionWithTryCatch()
{
String NotExistedFilePath="D:/abc.txt";
File inFile = new File(NotExistedFilePath);
try {
FileReader fileReader = new FileReader(inFile);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public static int UncheckedException() {
int[] s = new int[] { 1, 2, 3 };
int tmp;
tmp = s[3];
return tmp;
}

以上代码中,

  • 方法‘CheckedException’声明中未添加‘throws FileNotFoundException’,编译器就会报错。
  • 方法‘CheckedExceptionWithTryCatch’,错误被捕获打印,但没有抛出。
  • 方法‘UncheckedException’在被运行时,会抛错‘ArrayIndexOutOfBoundsException’。

3 如何使用异常处理机制

Java的异常处理机制异常是一种强大的调试手段,它解决了下三个问题:

  • 什么出了错?(异常类型)
  • 在哪出的错?(异常堆栈跟踪)
  • 为什么出错?(异常信息)

但是如果你没有使用好异常处理机制,即不清楚"何时抛出异常,何时捕获异常,何时处理异常",就不可能很好的解决上述三个问题。以下三大原则可以帮你很好的使用异常处理机制:

  1. 具体明确(异常类型)
  2. 提早抛出(1抛更具体的异常类型,2 更好的定位)
  3. 延迟捕获 (在能处理的时候捕获,而不是把它‘吃掉’)

以下是异常处理细则:

  1. 如果你不能处理异常,不要捕获该异常。
  2. 如果要捕获,应在离异常源近的地方捕获它。
  3. 不要吞没你捕获的异常。(就是捕获的异常,但是什么也不做)
  4. 除非你要重新抛出异常,否则把它log起来。
  5. 当一个异常被重新包装,然后重新抛出的时候,不要打印statck trace。
  6. 用自定义的异常类,不要每次需要抛出异常的时候都抛出java.lang.Exception。方法的调用者可以通过throws知道有哪些异常需要处理--所以它是自我描述的。
  7. 如果你编写业务逻辑,对于终端用户无法修复的错误,系统应该抛出非检查的异常(unchecked exception);如果你编写一个第三方的包给其他的开发人员用,对于不可修复的错误要用需要检查的异常(checked exception)。
  8. 绝对不要因为写throws语句会让你用起来不舒服,而不声明需要检查的异常。
  9. 应用级别的错误或不可修复的系统异常用非检查的异常(unchecked exception)抛出。*(注意是错误,意味着不可修复,比如配置文件错误)
  10. 根据异常的粒度组织你的方法

参考:

[1] 有效处理Java异常三原则

[2] Java中的异常处理:何时抛出异常,何时捕获异常?

Java中的异常处理:何时抛出异常,何时捕获异常,何时处理异常?的更多相关文章

  1. java中的异常处理机制_函数覆盖时的异常特点

    /*注意:异常声明在函数上 异常在子父类覆盖时的体现1.子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者异常的子类2.如果父类方法抛出多个异常,那么子类在覆盖该方法 ...

  2. java 中的异常处理

    一. 异常的概念和Java异常体系结构  异常是程序运行过程中出现的错误.本文主要讲授的是Java语言的异常处理.Java语言的异常处理框架,     是Java语言健壮性的一个重要体现. Java把 ...

  3. 深入了解 Java 中的异常处理 + 面试题

    # 深入了解 Java 中的异常处理 + 面试题 在程序开发中,异常处理也是我们经常使用到的模块,只是平常很少去深究异常模块的一些知识点.比如,try-catch 处理要遵循的原则是什么,finall ...

  4. Java中实现异常处理的基础知识

    Java中实现异常处理的基础知识 异常 (Exception):发生于程序执行期间,表明出现了一个非法的运行状况.许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象. 例如:数组越界和被0除. ...

  5. 第八节:详细讲解Java中的异常处理情况与I/O流的介绍以及类集合框架

    前言 大家好,给大家带来详细讲解Java中的异常处理情况与I/O流的介绍以及类集合框架的概述,希望你们喜欢 JAVA 异常 try...catch...finally结构的使用方法 class Tes ...

  6. Java中的异常处理:何时抛出异常,何时捕获异常?

    今天在看hadoop源码时,想想自己最近在做的那个系统,发现很多异常处理的方式不对,还是按照传统的异常处理方式(即:采用返回值来标识程序出现的异常情况).而hadoop中很多方法的声明是有异常抛出的, ...

  7. Java 中的异常处理机制

    生活中的异常:  不能够完整而顺利的完成一些工作 根据不同的异常进行相应的处理,而不会就此终端我们的生活 引出:  异常处理: 方式:  1.选择结构(逻辑判断)避免 demo:if逻辑处理异常 im ...

  8. Java中的异常处理机制《》

    异常机制已经成为判断一门编程语言是否成熟的标准,异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性. Java异常机制主要依赖于try.catch.finall ...

  9. 【转】Java中关于异常处理的十个最佳实践

    原文地址:http://www.searchsoa.com.cn/showcontent_71960.htm 导读:异常处理是书写强健Java应用的一个重要部分,Java许你创建新的异常,并通过使用 ...

随机推荐

  1. 通用MYSQL5.5和5.6源码包安装

    系统:REDHAT 6.3安装方式:最小化安装1.MYSQL5.5源码安装环境,依懒的安装包 yum install make gcc gcc-c++ ncurses-devel openssl-de ...

  2. ruby的sort方法的重新认识

    ruby中的sort方法,这个方法可以加一个两个参数的block,这个block可以返回1 0 -1来表示这两个参数大于 等于 小于示例: str = ["192.160.175" ...

  3. 树莓派进阶之路 (028) - 树莓派SQLite3的安装

    MySQL占用内存太大,而SQLite是一款轻量级零配置数据库,非常适合在树莓派和其他嵌入式系统中使用.SQLite文档详细资料丰富,本文不会详细解释SQLite数据库操作的方方面面,只能结合具体场景 ...

  4. 树莓派进阶之路 (027) - 在Linux中增加swap空间

    原贴地址:http://blog.csdn.net/chinalinuxzend/article/details/1759593  在Linux中增加swap空间 在安装Linux的时候,不知道swa ...

  5. 进阶之路(基础篇) - 009 通过底层AVR方法实现SPI数据传输

    主机端: /********************************* 代码功能:通过底层AVR方法实现SPI数据传输(主机端) 创作时间:2016*10*17 使用资源: 更低阶的 aTme ...

  6. 微信支付HTTPS服务器证书验证指引

    1. 背景介绍 2. 常见问题 3. 验证证书 4. 安装证书 背景介绍 微信支付使用HTTPS来保证通信安全, 在HTTPS服务器上部署了由权威机构签发的证书, 用于证明微信支付平台的真实身份. 商 ...

  7. ListView点击Item展开隐藏项(单项展开、多项展开、复杂布局时的展开处理)

    手机屏幕毕竟有限,当我们要显示较多数据时便不得不舍去一些次要信息.将主要信息优先显示,也使显示效果更加简洁美观.遇到类似的需求,我们使用最多的就是 ListView ,而假设每次点击一个 Item 都 ...

  8. 跟我学SharePoint 2013视频培训课程——排序、过滤在列表、库中的使用(10)

    课程简介 第10天,SharePoint 2013排序.过滤在列表.库中的使用. 视频 SharePoint 2013 交流群 41032413

  9. pdm画表间结构

    PDM(物理概念模型)各种属性建立如PK,AK等 https://blog.csdn.net/qq_27376871/article/details/51321609 CDM: ER图详细教程 通常在 ...

  10. centos 安装pecl

    一.更新yum源,安装php7 CentOS/RHEL 7.x: 1 rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-lates ...