浅谈Java异常处理机制
前言
在 Java 中,异常被当作对象来处理,所有的异常都有一个共同的祖先java.lang.Throwable类。Throwable有两个重要的子类Exception(异常) 和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。先从整体看看异常类层次结构图,使我们对异常体系有一个大概的认识:
Java异常类层次结构图,来源于参考文献1.
Error:是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
Exception:是程序本身可以处理的异常,它有一个重要的子类 RuntimeException。RuntimeException 异常由Java虚拟机抛出,主要指编码、环境或者用户操作输入出现问题。
注意,异常和错误的区别:异常能被程序本身处理,错误是无法处理的。使用try-catch-finally捕获异常,其捕获语法如下:
try {
需要被检测的代码;
} catch(异常类 变量名) {
异常处理代码;
} fianlly {
一定会执行的代码;
}
异常分类
总体上我们根据Javac对异常的处理要求,将异常类分为2类,即非受检查异常和受检查异常。
不受检查异常(unckecked exception):Error 和 RuntimeException 以及它们的子类。javac在编译时,不会提示和发现这样的异常,不要求在程序中处理这些异常。此类异常的出现常常是代码本身有问题造成的,应该从业务逻辑层面去解决并改进代码,而不是去通过异常处理机制解决。如分母为零的算术异常ArithmeticException,使用了空对象NullPointerException等等。
受检查异常(checked exception):除了 Error 和 RuntimeException的其它异常。javac强制要求程序员处理这样的异常,要么用try-catch语句捕获,要么用throws子句声明抛出;否则,直接导致编译失败。这样的异常一般是由程序的运行环境导致的,因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用这些程序,于是就应该为这样的异常时刻准备着如FileNotFoundException 等。
需要明确的是:受检查和非受检查是对于javac来说的,这样就很好理解和区分了。
常见异常及其分类
面试官也可能让你举出几个常见的异常情况并将其分类,未雨绸缪,下面列出了一些 Java 中常见的异常及其分类。
RuntimeException
-
数组下标越界异常 ArrayIndexOutOfBoundsException;
-
空指针异常 NullPointerException;
-
类型转换异常 ClassCastException;
-
非法参数异常 IllegalArgumentException。
UncheckedException
- 指定变量不存在异常 NoSuchFieldException 。
常见问题
-
Excption与Error的关系是什么?
Excption与Error都是Throwable的子类。
Error和Exception的区别:Error通常是灾难性的、致命的错误,是程序无法控制和处理的。当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程。Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的捕获这些异常。 -
如何自定义一个异常?
通过继承一个异常类自定义异常,运行时异常继承 RuntimeException,编译时异常继承 Exception。 -
try-catch-finally,try中有return,finally还执行吗?
执行。finally代码块的执行在return之前,不管try中是否有异常,它都执行。温馨提示,如果finally中有return,则会在try的return之前执行,导致不执行try中的return。 -
throw 和throws关键字的区别
throw用于在函数内抛出异常对象,后面跟的是异常对象。
throws用于在方法声明上抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。
例如:
static void demoException() throws Exception {
throw new Exception("error msg");
}
- 举个内存溢出的例子
public static void main(String[] args) {
//java.lang.OutOfMemoryError 内存溢出错误
byte[] buf = new byte[1024*1024*700];
}
小结
以上就是这篇文章的全部内容了,希望本文对大家的学习或者工作能带来一定的帮助,如有疑问请留言交流。Wiener在此祝各位生活愉快!工作顺利!