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

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

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

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

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

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

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

public class Test {

public static void main(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(手动滑稽)。

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

如何使用异常处理

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

public class Test {

public static void main(String args[]){

try{

int i = 0 / 0;

}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中去。

public class Test {

public static void main(String args[]){

try{

int i = 0 / 0;

}catch (NullPointerException e) {

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

}catch (ArithmeticException e){

System.out.println("这里捕获算术异常");

}finally {

System.out.println("这里是finally");

}

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

}

}

输出如下:

这里捕获算术异常

这里是finally

运行完毕!

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

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

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

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

public class Test {

public static void main(String args[]){

try{

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

}catch (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家族都有哪些成员,如何使用自定义异常,已经异常处理的实际使用中的正确姿势。欢迎大家继续关注,之后计划每周两篇以上的更新,如果有讲解遗漏或者不好的地方,欢迎大家及时指出,共同进步!

以上就是带你了解Java中的异常处理(上)的详细内容,更多关于Java异常处理的资料请关注脚本之家其它相关文章!

java异常处理怎么加_带你了解Java中的异常处理(上)相关推荐

  1. 常用的java虚拟机_带你了解 JAVA虚拟机 面试必备

    Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途.创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有 些区域则是依赖 ...

  2. java 基础 笔试题_非常全面的java基础笔试题

    1.下列说法正确的是() (程序结构) A java程序的main方法必须写在类甩面 B java程序中可以有多个main方法 C.java程序中类名必须与文件名一样 D.JAVA程序的main方法中 ...

  3. java第一阶段知识_坚持:学习Java后台的第一阶段,我学习了那些知识

    最近的计划是业余时间学习Java后台方面的知识,发现学习的过程中,要学的东西真多啊,让我一下子感觉很遥远.但是还好我制定了计划,自己选择的路,跪着也要走完!关于计划是<终于,我还是下决心学Jav ...

  4. java主要内存区域_可能是把Java内存区域讲的最清楚的一篇文章

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 介绍下 Java 内存区域(运行时数据区) Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么) 对象的访问定位的两种方式(句柄 ...

  5. java list sublist方法_(转)Java 中 List.subList() 方法的使用陷阱

    原文:http://blog.csdn.net/cleverGump/article/details/51105235 前言 本文原先发表在我的 iteye博客: http://clevergump. ...

  6. java weka命令行_使用自己的Java代码和模型获取WEKA中的预测百分比

    概观 我知道可以通过GUI和命令行选项在训练有素的WEKA模型中获得每个预测的百分比,如文档文章"Making predictions"中所方便解释和演示的那样. 预测 我知道有三 ...

  7. java虚拟机类加载机制_《深入理解java虚拟机》学习笔记一/类加载机制

    为何要读这本书? 近期看了左萧龙大哥的单例设计模式,后文讲解到了JVM对类实例化相关知识,感觉看着很无力,不懂,于是乎买本书研究下. 如何读? 个人水平一般,理解程度有限,书中说到每章关联不是很大,所 ...

  8. java 注解 属性 类型_跟光磊学Java开发-Java注解

    注解概述 注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记以后,java编译器.开发工具或者其他的框架就可以通过反射来获取类以及类的成员上的注解,然后通过作相应的处 ...

  9. 八爪鱼 是java做的吗_章鱼扫描仪:Java构建工具和恶意软件

    八爪鱼 是java做的吗 Alvaro Munoz最近在GitHub Security Lab网站上发布了" Octopus扫描程序恶意软件:攻击开源供应链 ". 我发现这篇文章很 ...

最新文章

  1. SQL Server(五)——常用函数
  2. C++ 数据类型转换
  3. go设计模式之代理模式
  4. 跨链Cosmos(3)IBC协议二
  5. vue修改html片段的样式无效,vue 组件中添加样式不生效的解决方法
  6. 除了 Python ,这些语言写的机器学习项目也很牛(二)
  7. C++STL容器,你真的会用了吗?——插入、删除、遍历和查找操作性能对比——删除(精简易懂版,句句干货)
  8. Unity轻松制作俯视角游戏插件TopDown Engine
  9. 加密解密之 crypto-js 知识
  10. 计算机科学与技术概论,计算机科学与技术概论论文
  11. Google地图开发API
  12. DAY02 pat乙级刷题(c++代码)
  13. 【父亲节故事】32岁入门学习编程的父亲给我的启示
  14. C 语言mj普通简单算法
  15. 如何利用Goby进行外围打点
  16. 2021年深圳考点临床医师计算机考试准考证
  17. CSS的水平居中、垂直居中和水平垂直居中
  18. 大道至简第七、八章读后感
  19. 推荐10个常用的国外BT种子下载网站
  20. 2009年国庆节,全国人民喜洋洋。

热门文章

  1. APP榜单查询,哪里可以查到iOS应用榜单数据
  2. z77 intel750装win7简略攻略
  3. 分布式架构与Dubbo-1-快速开始
  4. 《时生》优秀读后感范文4000字
  5. 【工具推荐】关于《轻笔记》
  6. idea 运行报错 Unrecognized option: --add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED
  7. 史上最全交互设计原则(三)之奥卡姆剃刀原理
  8. 【STM32Cube笔记】15-数模转换AD/DA
  9. 4个最糟糕的用户体验设计
  10. 【Python实践】关于python多任务设计基础