Exception和Error的理解

Exception和Error的理解

今日感悟:越是厉害的人,代码越容易理解

问题:

  • 请对比Exception和Error的区别,另外,运行时异常和一般异常有什么区别?

知识点分析:

一. 首先来个简单的类图感受一下Throwable、Exception、Error的设计和分类:

从上图中可以看出Exception和Error都是继承Throwable,也就是中Java中只有Throwable类型的实例才可以被抛出(Throw)或者捕获(catch)。

二. 掌握最基本的语法。如try-catch-finally块、throw、throws关键字等。同时懂得如何处理典型场景。

知识点补充:

随着Java语言的扩展,引入了一些更加便利的特性,try-with-resources和multiple catch。具体我这里引用了RxJava和Retorfit结合源码的一段。在编译时期,会自动生成相应的处理逻辑,比如:自定义AutoCloseable实现(AutoCloseable不了解的可以参考文章Java7中的Try-with-resources

//代码路径:
package retrofit2.adapter.rxjava2.CallExecuteObservable

@Override protected void subscribeActual(Observer<? super Response<T>> observer) {
   //省略逻辑
   ...
   
    try {
    //划重点了,这里没有贴代码,感兴趣自己调式execute方法 
      Response<T> response = call.execute();
      if (!disposable.isDisposed()) {
        observer.onNext(response);
      }
      if (!disposable.isDisposed()) {
        terminated = true;
        observer.onComplete();
      }
    } catch (Throwable t) {
    //划重点了,跟随优秀的开源框架一步步进去,你会发现它遵循了:
    //1.尽量捕获具体异常,不要捕获Throable或者Error //2.不生吞(swallow)异常
    //3.throw early
    //4.仅仅捕获必要代码块,try-catch会产生额外的性能开销
      Exceptions.throwIfFatal(t);
      if (terminated) {
        RxJavaPlugins.onError(t);
      } else if (!disposable.isDisposed()) {
        try {
          observer.onError(t);
        } catch (Throwable inner) {
          Exceptions.throwIfFatal(inner);
          RxJavaPlugins.onError(new CompositeException(t, inner));
        }
      }
    }
  }
复制代码

回答问题:

这边就不写了,根据上面类图和文字补充,各自组织语言吧(重要的是自己要有深度思考能力)

参考:http://ifeve.com/java-7%E4%B8%AD%E7%9A%84try-with-resources/ ,极客时间APP核心技术第二讲|Exception和Error有什么区别、retrofit2.adapter.rxjava2部分源码

声明:此为原创,转载请联系作者


作者:微信公众号添加公众号-遛狗的程序员 ,或者可以扫描以下二维码关注相关技术文章。

当然喜爱技术,乐于分享的你也可以可以添加作者微信号:

转载于:https://juejin.im/post/5b5987b0f265da0f955cd935

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101525.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JVM-内存结构「建议收藏」

    JVM-内存结构「建议收藏」分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.netJVM在执行程序的过程中会将内存划分为不同的数据区域,请看下图。如果理解了上图,JVM的内存结构基本上掌握了一半。从图中可以得到如下信息。第一,JVM分为五个区域:虚拟机栈、本地方法栈、方法区、堆、程序计数器。第二,JVM五个区中虚拟机栈、本地方法栈、程序计数器为线程私有,方法区和堆为线程共享区。图中已经用颜色区分。第三,JVM不同区域占用的内

    2022年6月4日
    33
  • docker镜像文件下载_docker安装centos7镜像

    docker镜像文件下载_docker安装centos7镜像1安装docker的apt源apt-getinstallapt-transport-httpsca-certificatescurlsoftware-properties-common

    2022年8月4日
    35
  • 情感词典文本情感分析_情感名词

    情感词典文本情感分析_情感名词基于情感词典的文本情感分类传统的基于情感词典的文本情感分类,是对人的记忆和判断思维的最简单的模拟,如上图。我们首先通过学习来记忆一些基本词汇,如否定词语有“不”,积极词语有“喜欢”、“爱”,消极词语有“讨厌”、“恨”等,从而在大脑中形成一个基本的语料库。然后,我们再对输入的句子进行最直接的拆分,看看我们所记忆的词汇表中是否存在相应的词语,然后根据这个词语的类别来判断情感,比如“我喜欢数学”,“喜

    2022年8月23日
    10
  • docker部署mysql的坏处_docker创建mysql数据库

    docker部署mysql的坏处_docker创建mysql数据库首先,确认创建容器的时候添加了-d参数,以守护进程的方式运行容器。或者,之前容器能够正常启动,突然启动不了,可以参考下面的解决方案。使用free命令查看内存状态[root@VM-16-15-centos~]#freetotalusedfreesharedbuff/cacheavailableMem:38263362077648504884220812

    2022年9月26日
    3
  • stm32的语音识别_基于STM32的嵌入式语音识别模块设计

    stm32的语音识别_基于STM32的嵌入式语音识别模块设计引言服务机器人以服务为目的,因此人们需要一种更方便、更自然、更加人性化的方式与机器人交互,而不再满足于复杂的键盘和按钮操作。基于听觉的人机交互是该领域的一个重要发展方向。目前主流的语音识别技术是基于统计模式。然而,由于统计模型训练算法复杂,运算量大,一般由工控机、PC机或笔记本来完成,这无疑限制了它的运用。嵌入式语音交互已成为目前研究的热门课题。嵌入式语音识别系统和PC机的语音识别系统相比,虽然其…

    2022年6月26日
    33
  • Mac 卸载cuda

    Mac 卸载cudaMac卸载cudasudoperl/usr/local/bin/uninstall_cuda_drv.pl检查是否卸载成功:gcc-v

    2022年6月21日
    57

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号