博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中的异常处理:何时抛出异常,何时捕获异常,何时处理异常?
阅读量:6329 次
发布时间:2019-06-22

本文共 2466 字,大约阅读时间需要 8 分钟。

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]

[2]

 

转载于:https://www.cnblogs.com/Ming8006/p/6962891.html

你可能感兴趣的文章
9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路...
查看>>
创建符合标准的、有语意的HTML页面——ASP.NET 2.0 CSS Friendly Control Adapters 1.0发布...
查看>>
Adobe驳斥Flash过度耗电论 称HTML5更耗电
查看>>
No!No!No! It's not fashion!
查看>>
艰困之道中学到的经验教训
查看>>
互联网生态建设落地五大挑战——保险科技生态建设 ...
查看>>
进行短视频app开发工作时,可以加入它来保护青少年 ...
查看>>
25G DAC无源高速线缆和25G光模块之间的区别
查看>>
乐乐茶完成近2亿元Pre-A轮融资,祥峰投资领投
查看>>
clickhouse修改时区
查看>>
CSS_定位
查看>>
第二十四章:页面导航(六)
查看>>
百度、长沙加码自动驾驶,湖南阿波罗智行科技公司成立 ...
查看>>
Java面试笔试题大汇总一(最全+详细答案)
查看>>
10 个 Linux 中方便的 Bash 别名
查看>>
[Server] 服务器配置SSH登录邮件通知
查看>>
全新 DOCKER PALS 计划上线,带给您不一样的参会体验! ...
查看>>
Android开发之自定义View(二)
查看>>
python爬虫之微打赏(scrapy版)
查看>>
自制操作系统Antz day08——实现内核 (中) 扩展内核
查看>>