Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 618|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-9-3 14:51:59 | 显示全部楼层 |阅读模式

    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中的异常处理:何时抛出异常,何时捕获异常?

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-3 01:46 , Processed in 0.063123 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表