Java—异常体系
Java的异常体系是Java语言中用于处理程序运行过程中可能出现的错误的机制。通过异常处理,程序可以在遇到问题时自动反馈,从而避免程序崩溃。Java异常体系中包含两大类:错误(Error)和异常(Exception)。
一、错误(Error)
1.1 概念
错误是指程序在运行时发现的非法操作,例如语法错误、逻辑错误或资源未找到等,会导致程序崩溃,无法继续执行后续代码。错误是由JVM产生和抛出的。
1.2 Error举例
1.2.1 栈溢出错误
public class test {public static void main(String[] args) {run();}public static void run(){run();}
}
运行结果
二、异常(Exception)
2.1 概念
异常是在程序正常执行过程中由于某个意外条件引发的事件,异常可以由错误引起的,也可以是应用程序中不小心出现的问题。
异常又可分为受检异常(非运行时异常)和非受检异常(运行时异常)。
2.2 受检异常(非运行时异常)
受检异常时程序还未执行是就发现了的异常,从语法角度上是必须处理的异常,如果不解决就无法编译通过。包括ClassNotFoundException、IOException等。
将鼠标移动到forName处,会提示添加异常到方法签名,即代码为
public class test {public static void main(String[] args) {run();}public static void run() throws ClassNotFoundException {Class clazz = Class.forName("com.qcby.util");}
}
2.3 非受检异常(运行时异常)
非受检异常是由程序逻辑产生的异常,编译器检测不到,在运行期间被发现的异常,包括数组越界IndexOutOfBoundsExpection、空指针异常NullPointerExpection等。
数组越界异常
public class test {public static void main(String[] args) {run();}public static void run(){int[] arr = {1,2,3};System.out.println(arr[3]);}
}
运行结果
注:错误(Error)和异常(Exception)有一个共同的父类:Thorwable,Java异常体系整体结构如下:
三、处理异常
Java中处理异常的方式分为两大类:throws(抛出异常)和try-catch-finally(解决异常的方式)。
3.1 try-catch-finally
3.1.1 try-catch-finally讲解
try-catch-finally:检查异常的代码,不会影响到其他代码的执行
比如在受检异常的例子中我们对forName异常进行了抛出:
抛出后会发现main()中的run()方法也被标红,这是因为run()方法抛出了异常,main()作为run()方法的调用者,也要抛出异常,但是在这里可以使用try-catch环绕进行解决:
public class test {public static void main(String[] args) {try {run();} catch (ClassNotFoundException e) {e.printStackTrace(); //打印异常}}public static void run() throws ClassNotFoundException {Class clazz = Class.forName("com.qcby.util");}
}
try-catch-finally解释:尝试执行try代码块之中的代码,若不能正常执行,则执行catch代码块中的代码,catch代码块之中的代码用于抛出异常,如上述代码为打印出异常。无论代码能否正常执行,finally之中的代码都会执行。
try-catch-finally结构如下(可以有多个catch{}):
try{//可能出现异常的代码块
}catch(ExpectionName1 e){//一旦产生了这个异常应该做的措施
}catch(ExpectionName2 e){//一旦产生了这个异常应该做的措施
}finally{//无论成功还是失败都要执行的代码//一般都是做资源的清除
}
补充:所有的异常的父类都是Expection异常。
因此,多个catch{}可以合并为:
try{//可能出现异常的代码块
}catch(Expection e){//产生异常应该做的措施
}finally{//无论成功还是失败都要执行的代码//一般都是做资源的清除
}
3.1.2 try-catch-finally使用举例
(1)不采用try-catch-finally
public class test {public static void main(String[] args) throws ClassNotFoundException {run();System.out.println("--------------------");}public static void run() throws ClassNotFoundException {int[] arr = {1,2,3};System.out.println(arr[3]);}
}
运行结果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3at com.qcby.test.test.run(test.java:10)at com.qcby.test.test.main(test.java:5)
(2)采用try-catch-finally
public class test {public static void main(String[] args) {try {run();} catch (ClassNotFoundException e) {e.printStackTrace();}finally {System.out.println("--------------------");}}public static void run() throws ClassNotFoundException {int[] arr = {1,2,3};System.out.println(arr[3]);}
}
运行结果
--------------------
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3at com.qcby.test.test.run(test.java:15)at com.qcby.test.test.main(test.java:6)
try-catch-finally包裹住异常的代码,不会影响其他代码的执行
3.2 throws
throws:不尝试解决异常,将异常抛出,交给有能力解决的方法取解决。
throw关键字:抛出异常,thorw用来自定义异常,提示方法的调用者
3.2.1 相关代码
public class test {public static void main(String[] args) throws Exception {run();System.out.println("--------------------");}public static void run() throws Exception {throw new Exception("这个方法可能存在问题");}
}
3.2.2 运行结果
Exception in thread "main" java.lang.Exception: 这个方法可能存在问题at com.qcby.test.test.run(test.java:9)at com.qcby.test.test.main(test.java:5)