提交 efbb8610 编写于 作者: 沉默王二's avatar 沉默王二 💬

图片

上级 82687196
......@@ -70,7 +70,7 @@ checked 异常(检查型异常)在源代码里必须显式地捕获或者抛
“我先画一幅思维导图给你感受一下。”
![](https://upload-images.jianshu.io/upload_images/1179389-01aeee263b511caf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://cdn.jsdelivr.net/gh/itwanger/Tech-Sister-Learn-Java/images/exception/gailan-01.png)
首先,Exception 和 Error 都继承了 Throwable 类。换句话说,只有 Throwable 类(或者子类)的对象才能使用 throw 关键字抛出,或者作为 catch 的参数类型。
......@@ -98,7 +98,7 @@ Class clz = Class.forName("com.itwanger.s41.Demo1");
如果没做处理,比如说在 Intellij IDEA 环境下,就会提示你这行代码可能会抛出 `java.lang.ClassNotFoundException`
![](https://upload-images.jianshu.io/upload_images/1179389-a60ca044b8d0e65e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://cdn.jsdelivr.net/gh/itwanger/Tech-Sister-Learn-Java/images/exception/gailan-02.png)
建议你要么使用 try-catch 进行捕获:
......
......@@ -41,7 +41,7 @@ Exception in thread "main" java.lang.ArithmeticException: 年纪未满 18 岁,
`Class.forName()` 方法在执行的时候可能会遇到 `java.lang.ClassNotFoundException` 异常,一个检查型异常,如果没有做处理,IDEA 就会提示你,要么在方法签名上声明,要么放在 try-catch 中。
![](https://upload-images.jianshu.io/upload_images/1179389-359e818705b260e7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://cdn.jsdelivr.net/gh/itwanger/Tech-Sister-Learn-Java/images/exception/throw-throws-01.png)
“那什么情况下使用 throws 而不是 try-catch 呢?”三妹问。
......
## try-catch-finally
回首页
新建文集
新建文章
在下方新建文章
已保存
教妹学 Java 第 42 讲:try-catch-finally
发布文章
“二哥,[上一节](https://mp.weixin.qq.com/s/fXRJ1xdz_jNSSVTv7ZrYGQ)你讲了异常处理机制,这一节讲什么呢?”三妹问。
“该讲 try-catch-finally 了。”我说,“try 关键字后面会跟一个大括号 `{}`,我们把一些可能发生异常的代码放到大括号里;`try` 块后面一般会跟 `catch` 块,用来处理发生异常的情况;当然了,异常不一定会发生,为了保证发不发生异常都能执行一些代码,就会跟一个 `finally` 块。”
......@@ -185,7 +178,7 @@ static int test2 () {
“三妹,来看一下源码的文档注释就全明白了!”
![](https://upload-images.jianshu.io/upload_images/1179389-97bdf20028db49f9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://cdn.jsdelivr.net/gh/itwanger/Tech-Sister-Learn-Java/images/exception/try-catch-finally-01.png)
至于参数 status 的值也很好理解,如果是异常退出,设置为非 0 即可,通常用 1 来表示;如果是想正常退出程序,用 0 表示即可。
......
......@@ -288,3 +288,10 @@ java.lang.Exception: out()
“靠谱!”三妹说。
----
**教妹学 Java**》预计一个月左右会有一次内容更新和完善,大家在我的公众号 **沉默王二** 后台回复“**03**” 即可获取最新版!如果觉得内容不错的话,欢迎转发分享!
<img src="https://cdn.jsdelivr.net/gh/itwanger/Tech-Sister-Learn-Java/images/itwanger.png" alt="图片没显示的话,可以微信搜索「沉默王二」关注" style="zoom:50%;" />
......@@ -6,7 +6,7 @@
三妹毫不犹豫地摇摇头,摆摆手,不好意思地承认自己的确没有自定义过。
![](https://upload-images.jianshu.io/upload_images/1179389-3d36fc838a8d9982.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://cdn.jsdelivr.net/gh/itwanger/Tech-Sister-Learn-Java/images/object-class/annotation-01.png)
“好吧,哥来告诉你吧。”
......
......@@ -163,18 +163,18 @@ public Object invoke(Object obj, Object... args)
`invoke()` 方法实际上是委派给 MethodAccessor 接口来完成的。
![](https://upload-images.jianshu.io/upload_images/1179389-cf59d2a1b37934bd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://cdn.jsdelivr.net/gh/itwanger/Tech-Sister-Learn-Java/images/object-class/fanshe-01.png)
MethodAccessor 接口有三个实现类,其中的 MethodAccessorImpl 是一个抽象类,另外两个具体的实现类继承了这个抽象类。
![](https://upload-images.jianshu.io/upload_images/1179389-595db69d6ceb5df6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://cdn.jsdelivr.net/gh/itwanger/Tech-Sister-Learn-Java/images/object-class/fanshe-02.png)
- NativeMethodAccessorImpl:通过本地方法来实现反射调用;
- DelegatingMethodAccessorImpl:通过委派模式来实现反射调用;
通过 debug 的方式进入 `invoke()` 方法后,可以看到第一次反射调用会生成一个委派实现 DelegatingMethodAccessorImpl,它在生成的时候会传递一个本地实现 NativeMethodAccessorImpl。
![](https://upload-images.jianshu.io/upload_images/1179389-47b6094ae1d261da.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://cdn.jsdelivr.net/gh/itwanger/Tech-Sister-Learn-Java/images/object-class/fanshe-03.png)
也就是说,`invoke()` 方法在执行的时候,会先调用 DelegatingMethodAccessorImpl,然后调用 NativeMethodAccessorImpl,最后再调用实际的方法。
......@@ -197,7 +197,7 @@ for (int i = 0;i < 20; i++) {
`invoke()` 方法处加断点进入 debug 模式,当 i = 15 的时候,也就是第 16 次执行的时候,会进入到 if 条件分支中,改变 DelegatingMethodAccessorImpl 的委派模式 delegate 为 `(MethodAccessorImpl)(new MethodAccessorGenerator()).generateMethod()`,而之前的委派模式 delegate 为 NativeMethodAccessorImpl。
![](https://upload-images.jianshu.io/upload_images/1179389-639e0af36f4a6e2c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://cdn.jsdelivr.net/gh/itwanger/Tech-Sister-Learn-Java/images/object-class/fanshe-04.png)
“这下明白了吧?三妹。”我说,“接下来,我们再来熟悉一下反射当中常用的 API。”
......
......@@ -13,7 +13,7 @@
有一对双胞胎,姐姐叫阿丽塔,妹妹叫洛丽塔。我们普通人可能完全无法分辨谁是姐姐谁是妹妹,可她们的妈妈却可以轻而易举地辨认出。
![](https://upload-images.jianshu.io/upload_images/1179389-e48fa921b25addda.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://cdn.jsdelivr.net/gh/itwanger/Tech-Sister-Learn-Java/images/string/equals-01.png)
`.equals()` 就好像我们普通人,看见阿丽塔以为是洛丽塔,看见洛丽塔以为是阿丽塔,看起来一样就觉得她们是同一个人;“==”操作符就好像她们的妈妈,要求更严格,观察更细致,一眼就能分辨出谁是姐姐谁是妹妹。
......
......@@ -87,7 +87,7 @@ cmower.split("[.]");
除此之外, 还可以使用 Pattern 类的 `quote()` 方法来包裹英文逗点“.”,该方法会返回一个使用 `\Q\E` 包裹的字符串。
![](https://upload-images.jianshu.io/upload_images/1179389-a176845b7f522cd5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://cdn.jsdelivr.net/gh/itwanger/Tech-Sister-Learn-Java/images/string/split-01.png)
来看示例:
......@@ -178,7 +178,7 @@ String [] parts = cmower.split("(?=,)");
“它其实是正则表达式中的断言模式。”我说,“你有时间的话,可以看看前面我推荐的两份开源文档。”
![](https://upload-images.jianshu.io/upload_images/1179389-ed77c97d9730dbeb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://cdn.jsdelivr.net/gh/itwanger/Tech-Sister-Learn-Java/images/string/split-02.png)
“`split()` 方法可以传递 2 个参数,第一个为分隔符,第二个为拆分的字符串个数。”我说。
......@@ -192,7 +192,7 @@ if (cmower.contains(",")) {
进入 debug 模式的话,可以看到以下内容:
![](https://upload-images.jianshu.io/upload_images/1179389-30e8de208e57437b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://cdn.jsdelivr.net/gh/itwanger/Tech-Sister-Learn-Java/images/string/split-03.png)
也就是说,传递 2 个参数的时候,会直接调用 `substring()` 进行截取,第二个分隔符后的就不再拆分了。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册