Java异常处理机制很有意思-阿里云开发者社区

开发者社区> 沉默王二> 正文

Java异常处理机制很有意思

简介: Java异常处理机制很有意思
+关注继续查看

前言:在网络上看到一篇《深入理解Java异常处理机制》,看完感觉自己也有一点小想法,的确在很多Java学者的眼里,异常处理机制不就是try catch finally吗,有啥好理解,很多时候,我也经常忽略这方面的内容,感觉没什么有意思的,那么我们来扎个小马步吧。


1.经过对原作者的例子改造

package mwq;


public class T1 {


public static void main(String[] args) {

 boolean b = true;

 try {

  b = tb1();

 } catch (ArithmeticException e) {

  System.out.println("main catch the value of b : " + b);

  b = false;

  throw e;

 } finally {

  System.out.println("main finally b : " + b);

 }


}


public static boolean tb1() throws ArithmeticException {

 boolean b = true;


 try {

  if (!tb2()) {

   return false;

  }

 } catch (ArithmeticException e) {

  System.out.println("tb1 catch the value of b : " + b);

  b = false;

  throw e;

 } finally {

  System.out.println("tb1 finally b : " + b);

 }


 return b;

}


@SuppressWarnings("finally")

public static boolean tb2() throws ArithmeticException {

 boolean b = true;


 try {

  System.out.println(1 / 0);

 } catch (ArithmeticException e) {

  System.out.println("tb2 catch the value of b : " + b);

  b = false;

  throw e;

 } finally {

  System.out.println("tb2 finally b : " + b);

  return b;

 }

}


}

2.我自己感觉有意思的例子

package mwq;


public class T {


public static void main(String[] args) {

 try {

  System.out.println(1 / 0);

  System.out.println("ccccccccccccccccccc");

 } catch (ArithmeticException e) {

  System.out.println(1 / 0);

  System.out.println("aaaaaaaaaaaaaaaaaaa");

 } finally {

  System.out.println(1 / 0);

  System.out.println("bbbbbbbbbbbbbbbb");

 }

}


}

第一个例子就不多讲了,如果你的答案如下

tb2 catch the value of b : true

tb2 finally b : false

tb1 finally b : true

main finally b : false

那么,你就不需要你就可以不看原作者的例子了,不过可以读读他那么基础的理论知识。


对于第二个例子,在很多实际的应用中用到的很多,正常流程中,就如try语句,大多数情况下,我们很自觉的加上对应的catch语句,至少是catch Exception,那么这个是没有问题,但是很多时候,我们的catch语句中也有一些逻辑处理,并非简单的输出错误日志,假如我们在catch中再出现错误时,很多时候,catch中我们多数认为是正常的代码,于是我们不再对catch中语句进行catch捕获,那么按照上面的例子,你的答案是这样的吗?


Exception in thread "main" java.lang.ArithmeticException: / by zero

at mwq.T.main(T.java:13)


错误时代码的13行,为什么不是第10行代码的错误呢,因为finally的作用就是,无论catch有没有捕获到错误,finally都要执行,虽然代码的第10行已经抛出异常了,但是程序会先执行finally而不是将catch的错误在堆栈中打印出来,因为finally中已经出错了,程序要先把finally中的错误进行处理,然后程序将错误打印出来后,就终止了,这个时候第10行的错误也就不会输出了,假如程序是这样的

package mwq;


public class T {


public static void main(String[] args) {

 try {

  System.out.println(1 / 0);

  System.out.println("ccccccccccccccccccc");

 } catch (ArithmeticException e) {

  System.out.println(1 / 0);

  System.out.println("aaaaaaaaaaaaaaaaaaa");

 } finally {

  System.out.println("bbbbbbbbbbbbbbbb");

 }

}


}

那么此时你认为结果会是怎样呢,结果有两种

bbbbbbbbbbbbbbbb

Exception in thread "main" java.lang.ArithmeticException: / by zero

at mwq.T.main(T.java:10)


Exception in thread "main" java.lang.ArithmeticException: / by zero

at mwq.T.main(T.java:10)

bbbbbbbbbbbbbbbb

为什么会有两种结果呢,大多数情况下,都会先输出bbbbbbbbbbbbbbbbb,然而由于out对象也是输入输出流,JVM在进行处理的时候,少数情况下会将错误信息先打印出来,而后再将out对象的bbbbbbbbbbbbbbb输出出来,这可能是线程调度的原因,但是请小伙伴们怀疑我这种结论,因为我并没有证明是这种情况。


总结:总体而言,我感觉Java异常处理机制是很有意思,而不简单。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ECS服务器使用体验
部分java开发环境搭建
21 0
【SpringCloud-Alibaba系列教程】6.openfegin的使用
新年不停更,White带着大家以微服务架构和设计模式落地实战的方式,进行讲解和实现SpingCloud的代码开发,本节将介绍一下openfegin的使用。
4 0
搭建服务器初体验
服务器安装mysql、tomcat
23 0
学妹教你并发编程的三大特性:原子性、可见性、有序性
在并发编程中有三个非常重要的特性:原子性、有序性,、可见性,学妹发现你对它们不是很了解,她很着急,因为理解这三个特性对于能够正确地开发高并发程序有很大的帮助,接下来的面试中也极有可能被问到,小学妹就忍不住开始跟你逐一介绍起来
5 0
Flutter 初学者的简单例子充分解释
关于 Flutter 语言: Flutter 是一种语言工具,允许您使用单一的原生编程语言代码创建跨原生平台的应用程序。Flutter 为我们提供了灵活性和兼容性,默认情况下,Android有两种编程语言Java和iOS 开发的Swift(Objective C)两种编程语言,但使用 Flutter 无需学习这两种语言,我们只需学习一种编程语言Dart 即可。Flutter 是一个用 Dart 语言创建的移动开发框架。Flutter中生成的主要编码文件在**.dart中**延期。主文件名为 main.dart。该文件位于 lib 文件夹下。我会在后面带领大家详细了解有关 Flutter 项目结
7 0
ECS使用体验
使用ESC服务器搭建过比赛使用的web应用、在上面做过深度学习的实验
19 0
大学生第一次使用阿里云的感受
阿里云、服务器、tomcat、xshell
18 0
找不到 tools.jar。请检查 C:\Program Files\Java\jre1.8.0_151 是否包含有效的 JDK 安装
今天全新安装了windows11之后 安装flutter等环境之后运行项目 却发现报错 找不到 tools.jar。请检查 C:\Program Files\Java\jre1.8.0_151 是否包含有效的 JDK 安装
5 0
一条命令解决macmnsvc.exe占用8081端口的问题
无法杀掉macmnsvc.exe进程,一条命令解决macmnsvc.exe占用8081端口的问题!
5 0
腾讯面试居然跟我扯了半小时的CountDownLatch
一个长头发、穿着清爽的小姐姐,拿着一个崭新的Mac笔记本向我走来,看着来势汹汹,我心想着肯定是技术大佬吧!但是我也是一个才华横溢的人,稳住我们能赢。
6 0
+关注
沉默王二
微信搜索「沉默王二」,回复关键字「00」获取硬核计算机基础资料。
1084
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载