聊聊Java中的异常及处理

前言在编程中异常报错是不可避免的 。特别是在学习某个语言初期,看到异常报错就抓耳挠腮,常常开玩笑说编程1分钟,改bug1小时 。今天就让我们来看看什么是异常和怎么合理的处理异常吧!
异常与error介绍下面还是先让我们来看一下基本概念吧!
? 异常指程序运行过程中出现的非正常现象,例如用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等 。异常机制本质就是当程序出现错误,程序安全退出的机制 。在JAVA的异常处理机制中,引进了很多用来描述和处理异常的类,称为异常类 。异常类定义中包含了该类异常的信息和对异常进行处理的方法 。
? Java是采用面向对象的方式来处理异常的 。处理过程:

  1. 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE 。
  2. 捕获异常:JRE得到该异常后,寻找相应的代码来处理该异常 。JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止 。
让我们来看看前面所讲到的异常类究竟是个什么东西!
其实所有的异常对象都是派生于Throwable类的一个实例 。如果内置的异常类不能够满足需要,还可以创建自己的异常类 。所有异常的根类为java.lang.Throwable 。看看它的家族长什么样 。
聊聊Java中的异常及处理

文章插图
 
Throwable类下面主要是两大门派 。Error和Exception 。
  • Error是程序无法处理的错误,表示运行应用程序中较严重问题,系统JVM已经处于不可恢复的崩溃状态中 。例如,说内存溢出和线程死锁等系统问题 。
  • Exception是程序本身能够处理的异常 。Exception类是所有异常类的父类,其子类对应了各种各样可能出现的异常事件 。通常Java的异常可分为:RuntimeException 运行时异常CheckedException 已检查异常下面我们来研究研究这两个异常 。
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异常的机制和处理过程 。
  1. 在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler) 。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合 。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适的异常处理器 。
  2. 运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行 。当运行时系统遍历调用栈而未找到合适的异常处理器,则运行时系统终止 。同时,意味着Java程序的终止 。
上面我们讲述了什么是运行时异常以及一些处理方式,下面就再来看看什么是已检查异常吧!
所有不是RuntimeException的异常,统称为Checked Exception,又被称为“已检查异常”,如IOException、SQLException等以及用户自定义的Exception异常 。这类异常在编译时就必须做出处理,否则无法通过编译 。
通常异常的处理方式有两种:
  1. 使用“try/catch”捕获异常
  2. 使用“throws”声明异常 。
下面就来详细的聊聊吧!
异常的处理上面已经提了,异常处理通常有2种方式 。先看看捕获异常吧 。
捕获异常是通过3个关键词来实现的:try-catch-finally 。用try来执行一段程序,如果出现异常,系统抛出一个异常,可以通过它的类型来捕捉(catch)并处理它,最后一步是通过finally语句为异常处理提供一个统一的出口,finally所指定的代码都要被执行 。
这个捕获异常其实也是我们在面试的时候会经常碰到的问题 。下面我们分别再来对各个部分做一个简单的提示吧!


推荐阅读