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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue项目中关闭eslint的方法

    vue项目中关闭eslint的方法一群胡说八道的,说注释这个rule,那个rule,全tm球用没有。还有说在webpack.config.js等文件里操作的,但vue-cli创建出来的项目中根本没有这些玩意。方法在项目根目录下增加vue.config.js文件。内容如下://vue.config.jsmodule.exports={lintOnSave:false}完事。转载链接:添加链…

    2022年4月27日
    33
  • 分析函数 ExecuteSQL

    分析函数 ExecuteSQL
    在学生管理系统中,执行sql语句时,我们用到这个函数,当时有几点不明,现在说说我的理解。
     
    PublicFunctionExecuteSQL(ByValSQLAsString,MsgStringAsString)AsRecordset
      ……
      sTokens=Split(SQL)
    ‘Split返回一个下标从0开始的一维数组,包含指定数目的子字符串。”Select”+”*”+”from”+”user_Info”+

    2022年5月11日
    40
  • 桌面软件图标变成白纸的解决方法是什么_笔记本桌面图标变成白纸

    桌面软件图标变成白纸的解决方法是什么_笔记本桌面图标变成白纸在桌面上新建一个txt文件:在文件里输入以下内容并保存:rem关闭Windows外壳程序explorertaskkill/f/imexplorer.exerem清理系统图标缓存数据库attrib-h-s-r“%userprofile%\AppData\Local\IconCache.db”del/f“%userprofile%\AppData\Loca…

    2022年10月18日
    0
  • angular4父组件向子组件传值,子组件向父组件传值的方法

    angular4父组件向子组件传值,子组件向父组件传值的方法父组件向子组件传值@Input文件目录父组件:father.template.html<h1>父组件</h1><cmt-child[data]=’data’></cmt-child>father.component.tsimport{Component,OnIn…

    2022年5月9日
    72
  • vscode 快捷键图[通俗易懂]

    vscode 快捷键图[通俗易懂]

    2022年6月11日
    51
  • 网络协议篇之DHCP协议(一)—— DHCP协议基础

    网络协议篇之DHCP协议(一)—— DHCP协议基础一,动态主机配置协议DHCP1,DHCP简介DHCP(DynamicHostConfigurationProtocol),动态主机配置协议,是一个应用层协议。当我们将客户主机ip地址设置为动态获取方式时,DHCP服务器就会根据DHCP协议给客户端分配IP,使得客户机能够利用这个IP上网。DHCP的前身是BOOTP协议(BootstrapProtocol),BOOTP

    2022年5月10日
    52

发表回复

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

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