当当当当当当,各位看官,好久不见,甚是想念。

今天我们来聊聊Java里的一个小妖精,那就是异常。

什么是异常?什么是异常处理?

异常嘛,顾名思义就是不正常,(逃),是Java程序运行时,发生的预料之外的事情,它阻止了程序按照程序员的预期正常执行。

异常处理,应该说异常处理机制,就是专门用来制服这个小妖精的法宝。Java中的异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。

简而言之,Java异常处理就是能让我们主动迎击可能到来的异常,并将它们以圆润的方式处理掉。

还是先来看个小栗子,看看java里的异常长什么样。

public classTest {static voidmain(String args[]){int i = 0 / 0;

System.out.println("i = " +i);

}

}

别慌别慌,不要看到红色提示就内心崩溃只想关掉IDE,来,抓紧我的手,带你看清“异常”这个磨人的小妖精的真面目(滑稽)。

代码里将0作为了分母,因此程序会发生算术异常,抛出一个异常后,如果没有任何处理,默认会终止程序,所以后面的打印内容并没有输出。在异常内容里,有说明异常类型为:java.lang.ArithmeticException,也就是算术异常,后面跟着的是异常原因: / by zero,也就是说异常出现的原因是将0作为了分母,而且后面还有堆栈信息,指出了异常抛出的位置是在com.frank.chapter16.main.Test.main这个包下,Test类的第11行(这个行数如果跟你想的不一样,不要在意,因为我的代码开始之前还有一些不可描述的说明信息),因为只有一次方法调用,所以没有很长的堆栈信息,看起来也很简洁明了。

所以你看,其实异常也没那么可怕吧,不仅给了异常原因,还告诉了你这个bug是出在第几行,所以好好利用它,可以帮助你写出更难以发现的bug,呸,说错了,可以帮助你更容易找到bug(手动滑稽)。

如果不希望抛出异常后程序就结束,而是希望它继续运行呢?那么就捕获它。

如何使用异常处理

我们来把上面那个栗子改改:

try{;

}catch(Exception e){

System.out.println("好像发生异常了,但是我不管,我还要继续运行");

}

System.out.println("运行完毕!");

}

}

输出如下:

好像发生异常了,但是我不管,我还要继续运行

运行完毕!

好的,很强势,现在即使抛出了异常,程序也继续运行了。异常就像是一头野兽,但你一旦捕获它,驯服它,就可以为你所用,为所欲为了。

try...catch...是常用的异常处理搭配,如果在try语句块中发生了异常,如果刚好这个异常被捕获到了,那么会直接跳到catch语句块中,执行catch语句中的代码,像上面的栗子里,因为对Exception类进行了捕获处理,所以当它的子类异常java.lang.ArithmeticException被抛出来的时候,也能捕获它。关于Exception类的结构层次关系,后面再做详细介绍。

还有另外一种搭配方式,那就是try...catch...finally,finally语句块比catch要强势的多,前面说了catch语句块必须要捕获到了特定的Exception才会执行里面的代码,如果catch的是ArithmeticException但是抛出的却是空指针异常,那就不会被捕获了,异常也就逃之夭夭了。这个时候,finally的优势就展示出来了,不管抛出什么样的异常,也不管是否抛出了异常,finally中的代码都会被执行。所以一般的用法是在finally语句块里释放掉那些需要被释放的资源,如socket连接,关闭io流,关闭数据库连接等等。也就是说一般在finally中收拾try中抛出的烂摊子,心疼一秒finally,果然能者多劳啊。

当然,try...finally这样的搭配也是ok的,需要注意的是,当try语句中发生了异常之后,在发生异常处之后的代码将不会再执行,而是跳到相应的catchu或者finally中去。

(NullPointerException e) {

System.out.println("这里捕获空指针异常");

}(ArithmeticException e){

System.out.println("这里捕获算术异常"finally{

System.out.println("这里是finally"这里捕获算术异常

这里是finally

运行完毕!

在上面的代码中,catch语句块是可以同时使用多个的,第一个catch语句块捕获的是空指针异常,但由于抛出的是算术异常,所以没有捕获住,但被第二个catch捕获到了,所以第二个catch语句块中的代码执行了。异常匹配是按照从上到下的顺序进行匹配的,最后才执行finally中的代码块。关于try...catch...finally,还有一个很有趣的return问题,如果三个语句块里都有return,最终返回结果会是怎样呢?这里做了详细的说明,http://www.cnblogs.com/mfrank/p/7895660.html 有兴趣的话可以看一看。

绝大多数情况下,finally中的代码都是会被执行的,只有一种情况下,finally中的代码不会被执行,那就是在try语句块中结束掉了虚拟机(如:使用 System.exit(0); )。

关于异常,还有一个关键字需要介绍,那就是throw,使用throw可以主动抛出一个异常。看到这你也许会一脸懵逼,主动抛出???嫌异常不够多,凑热闹不嫌事大??别急别急,中间一定有什么误会,把刀放下,有话好好说。

throw关键字确实是用来抛出异常的,你可以这样使用:

throw new NullPointerException("听说你很闲,给你抛个异常。"(NullPointerException e) {

System.out.println("这里捕获空指针异常,提示内容:" +e.getMessage());

e.printStackTrace();

}

}

}

输出如下:

这里捕获空指针异常,提示内容:听说你很闲,给你抛个异常。

java.lang.NullPointerException: 听说你很闲,给你抛个异常。

at com.frank.chapter16.main.Test.main(Test.java:11)

用throw关键字可以抛出任意类型的异常,当然,你想的话,还有抛Error,至于什么是Error,已经跟Exception的关系,将在下一篇里进行讲解。暂时不用深究。

在throw异常的时候,可以加上抛出异常的原因,这样可以更方便定位问题所在,当然,一般来说不会像栗子中这样使用的,这里只是为了简单起见。

到此为止,异常的上半篇已经讲解完毕,在这一篇里,说明了什么是异常,什么是异常处理,以及如何使用异常处理机制。相信大家对这个小妖精有了初步的认识,下一篇中,将会讲解Exception家族都有哪些成员,如何使用自定义异常,已经异常处理的实际使用中的正确姿势。欢迎大家继续关注,之后计划每周两篇以上的更新,如果有讲解遗漏或者不好的地方,欢迎大家及时指出,共同进步!

相关文章

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

java 提高篇_【Java入门提高篇】Day16 Java异常处理(上)相关推荐

  1. c和java哪个好学_编程入门学习c++和Java哪个比较好

    编程入门学习c++和Java哪个比较好 发布时间:2020-04-25 16:54:41 来源:亿速云 阅读:231 作者:栢白 编程入门学习c++和Java哪个比较好?如今这些都是小白比较关心的,如 ...

  2. java 软尾 铝_软尾入门车款:JAVA FURIA 27.5上市

    铝合金车架.前后 100mm 避震行程.超短把立.长款燕把.27.5 轮径-- JAVA 软尾入门 FURIA 现已上市,在这台车上你能拥有全避震车型所应该具备的所有基础元素. 消光黑橙 配置参数: ...

  3. Java国际化教程_编程入门自学教程_菜鸟教程-免费教程分享

    教程简介 Java国际化入门教程 - 从简单的步骤了解Java国际化从基本到高级概念,包括概述,环境设置,区域设置,区域设置详细信息,显示语言,ResourceBundle,NumberFormat, ...

  4. java 二分查找_计算机入门必备算法——二分查找法

    1.引言 笔者对于计算机的研究一直停滞不前,近期想对一些算法进行复习和进一步的研究,每天都会更新一个新的算法,算法有难有易,层层递进.不希望能学的有多么高深,只希望在一些最基本的算法上有编码的思路,或 ...

  5. java如何找到程序入口_系统分析---入门(如何确定java应用的入口)

    一.场景 小A拿到一个java的开源项目(如eclipse项目),此开源项目可以启动,并且已经拿到了该项目的源码,小A想对这个开源项目进行一次系统的学习. 二.问题: 这时候,小A遇到了一个问题,如何 ...

  6. java hashtable 数据结构_数据结构--哈希表(Java)

    数据结构--哈希表(Java) 介绍 哈希表 底层是 数组加链表 或者是 数组加二叉树 ,一个数组里面有多个链表,通过散列函数来提高效率 代码 package cn.guizimo.hashtab; ...

  7. java 多重属性_最全面的44个Java 性能调优细节

    我认为,代码优化的最重要的作用应该是:避免未知的错误.在代码上线运行的过程中,往往会出现很多我们意想不到的错误,因为线上环境和开发环境是非常不同的,错误定位到最后往往是一个非常小的原因. 然而为了解决 ...

  8. java自学难点_分享在达内教育培训Java的感受

    刚在达内教育培训完java,给即将来培训以及已经在培的学员分享下我的感受 回想一下在达内教育学习Java时的情景,我仍然兴奋不已,其实在刚接触Java时,自己确实有点晕,但经过一段时间学习,逐渐走出了 ...

  9. java核心面试_前100多个核心Java面试问题

    java核心面试 Core Java interview questions help you in preparing for java based interviews. Whether you ...

  10. java算术表达式_一文了解如何用 Java 进行算术表达式计算

    (给ImportNew加星标,提高Java技能) 编译:ImportNew/唐尤华 如何用Java计算"5+3"."10-40"."10*3" ...

最新文章

  1. js java cookie_JS 打开一个模式窗口,使用Cookie传递一个参数
  2. 读书计划清单之碎碎念
  3. win10 远程出现身份验证错误 要求的函数不受支持
  4. Intervals on the Ring
  5. 不同语言,系统通过共享内存方式实现信息交互
  6. h5获取http请求头_nodejs 中http请求头,响应头
  7. 16薪,六险一金,深尚科技招聘视觉/图像算法工程师 ,包含社招和校招
  8. python时间处理方法_基于python时间处理方法(详解)
  9. unity3d进行脚本资源打包加载
  10. C++ 调用 python
  11. python 日历热力图_Python如何绘制日历图和热力图
  12. UI自动化测试之元素定位
  13. 使用EasyExcel读取excel文件案例
  14. 2018-2019-1 20165211 20165230 20165208 实验二 固件程序设计-1
  15. 嗨到起飞!终于搞懂前端数据可视化了!
  16. location.hostnbsp;与nbsp;locat…
  17. 处理器排行_2019年度PC处理器性能排行榜:AMD反超Intel
  18. 不知道吧?未加工的食物可以帮助你减肥
  19. overshoot是什么matlab,Overshoot metrics of bilevel waveform transitions
  20. NBA GLOSSARY

热门文章

  1. 彻底卸载Visual Studio2013、15、17方法
  2. MapReduce算法(计算出10月1日这天全天停运的车辆,)
  3. 【074】技术领先 | 翼辉 SylixOS 通过 IEC 61508(SIL3) / EN 50128(SIL4) 国际安全认证
  4. 百度大规模战略性混部系统演进
  5. 长亭科技新品万象发布,升级全线产品,致力用“智能”代替“规则”
  6. matlab抽样判决器,QPSK解调抽样判决报错
  7. 如何设计出用户体验良好的登录/注册页面
  8. Solidity笔记10:合约创建
  9. 在win7安装theano
  10. LE AUDIO介绍