前言在编程中异常报错是不可避免的 。特别是在学习某个语言初期,看到异常报错就抓耳挠腮,常常开玩笑说编程1分钟,改bug1小时 。今天就让我们来看看什么是异常和怎么合理的处理异常吧!
异常与error介绍下面还是先让我们来看一下基本概念吧!
? 异常指程序运行过程中出现的非正常现象,例如用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等 。异常机制本质就是当程序出现错误,程序安全退出的机制 。在JAVA的异常处理机制中,引进了很多用来描述和处理异常的类,称为异常类 。异常类定义中包含了该类异常的信息和对异常进行处理的方法 。
? Java是采用面向对象的方式来处理异常的 。处理过程:
- 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE 。
- 捕获异常:JRE得到该异常后,寻找相应的代码来处理该异常 。JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止 。
其实所有的异常对象都是派生于Throwable类的一个实例 。如果内置的异常类不能够满足需要,还可以创建自己的异常类 。所有异常的根类为java.lang.Throwable 。看看它的家族长什么样 。
文章插图
Throwable类下面主要是两大门派 。Error和Exception 。
- Error是程序无法处理的错误,表示运行应用程序中较严重问题,系统JVM已经处于不可恢复的崩溃状态中 。例如,说内存溢出和线程死锁等系统问题 。
- Exception是程序本身能够处理的异常 。Exception类是所有异常类的父类,其子类对应了各种各样可能出现的异常事件 。通常Java的异常可分为:RuntimeException 运行时异常CheckedException 已检查异常下面我们来研究研究这两个异常 。
这类异常通常是由编程错误导致的,所以在编写程序时,并不要求必须使用异常处理机制来处理这类异常,而是经常需要通过增加“逻辑处理来避免这些异常” 。
比如以下常见的几种异常:
ArithmeticException异常
int b=0; System.out.println(1/b); //解决:if(b!=0){System.out.println(1/b);}
NumberFormatException异常String str = "1234abcf";System.out.println(Integer.parseInt(str));//解决: Pattern p = Pattern.compile("^\d+$");Matcher m = p.matcher(str);if (m.matches()) { // 如果str匹配代表数字的正则表达式,才会转换System.out.println(Integer.parseInt(str));}
ClassCastException异常Animal a=new Dog();Cat c=(Cat)a;//解决:if (a instanceof Cat) {Cat c = (Cat) a;}
这里再补充两点,方便大家更好的理解java异常的机制和处理过程 。- 在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler) 。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合 。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适的异常处理器 。
- 运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行 。当运行时系统遍历调用栈而未找到合适的异常处理器,则运行时系统终止 。同时,意味着Java程序的终止 。
所有不是RuntimeException的异常,统称为Checked Exception,又被称为“已检查异常”,如IOException、SQLException等以及用户自定义的Exception异常 。这类异常在编译时就必须做出处理,否则无法通过编译 。
通常异常的处理方式有两种:
- 使用“try/catch”捕获异常
- 使用“throws”声明异常 。
异常的处理上面已经提了,异常处理通常有2种方式 。先看看捕获异常吧 。
捕获异常是通过3个关键词来实现的:try-catch-finally 。用try来执行一段程序,如果出现异常,系统抛出一个异常,可以通过它的类型来捕捉(catch)并处理它,最后一步是通过finally语句为异常处理提供一个统一的出口,finally所指定的代码都要被执行 。
这个捕获异常其实也是我们在面试的时候会经常碰到的问题 。下面我们分别再来对各个部分做一个简单的提示吧!
推荐阅读
- 浅谈分布式存储中的网络通信
- 禅茶佛教中的茶文化,佛教与茶参禅悟道
- 淘宝账号注销后进行中的订单怎么恢复 淘宝不小心注销了怎么恢复
- 聊聊服务灾备
- 五 菊花酒的功效与作用
- 前后 如何使用JavaScript访问设备摄像头
- 带你读懂信息安全中的恶意代码、病毒、木马、蠕虫......
- 传说中的“洋葱头Tor”是如何做到匿名通信的?
- 有史以来25个最伟大的Java应用程序
- 聊聊DOS操作系统中的文件系统FAT12