Java基础学习(七):异常机制
- Java基础学习(七):异常机制
- 概念
- 简单分类
- 异常体系结构
- 异常处理机制
- 自定义异常
本文为个人学习记录,内容学习自 狂神说Java
概念
异常指程序运行中出现的不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等
异常发生在程序运行期间,它影响了正常的程序执行流程
简单分类
异常 vs 错误
-
异常(Exception)
-
异常是开发者可以在程序中进行处理的(可以通过编写异常处理语句,在出现异常时进行处理以恢复程序的正常运行)
-
检查性异常:在编译时由编译器强制检查的异常,开发者必须处理这些异常才能编译通过
-
运行时异常:在编译时可以被忽略的异常,程序运行时才会出现
-
-
错误(Error)
- 错误是开发者无法在程序中进行处理的(错误发生时就无力回天了,只能避免错误的发生)
- 当出现错误时,JVM 一般会直接终止线程
异常体系结构
-
Java 把异常当作对象来处理,并定义了一个基类
Java.lang.Throwable
作为所有异常的超类(即最顶层的类) -
在 Java API 中已经定义了许多异常类,这些异常类分成两大类 —— 错误和异常
-
下图给出了一些常见错误Error和异常Exception,仅表示大体结构,例如 RuntimeException 和 ArrayIndexOutOfBoundsException 中间还省略了一些子/父类
异常处理机制
-
抛出异常
int a = 1; int b = 0; System.out.println(a/b); // 由于0不能作为除数,程序会抛出异常 ========================================================================================================= 输出结果: Exception in thread "main" java.lang.ArithmeticException: / by zero
-
捕获异常
可以通过
try-catch
语句捕获异常,从而使程序在有异常的情况下继续执行int a = 1; int b = 0; try {System.out.println(a/b); // 将可能抛出异常的语句放入try修饰的代码块中 }catch (ArithmeticException e){ // 指明想捕获的异常类型System.out.println("程序出现异常才会执行"); // 如果捕获到了指定异常会执行的语句,通常是处理语句 }finally { // finally代码块是可选项,无论是否捕获到异常都会执行System.out.println("无论如何都会执行"); } System.out.println("继续执行"); // 就算存在异常,程序也会继续执行下去
几点补充:
- 想捕获的异常类型也可以是具体异常类的父类,例如写
catch (Throwable e)
时能够捕获到其下所有的错误和异常 - catch 语句可以存在多个,类似于 else if 语句,从上往下执行当捕获到异常后就不会执行剩余的 catch 语句了
- 如果在 try 语句块内捕获到了指定异常,那么 try 语句块中的所有内容都不会被执行,就算是能正常执行的语句也不会被执行
- 想捕获的异常类型也可以是具体异常类的父类,例如写
-
主动抛出异常
注意:主动抛出异常后,剩余代码将不会继续执行,除非使用 try-catch 语句捕获异常(和程序自动抛出的异常同理)
-
方法内抛出异常(使用
throw
关键字)throw new ArithmeticException(); // 主动抛出一个算术异常
-
方法上抛出异常(使用
throws
关键字)下面这个例子中,其实不在方法上抛出异常也能在 main 方法中捕获到异常,方法上抛出异常的用法主要是在自定义异常中
public static void main(String[] args) {int a = 1;int b = 0;try {test(a, b);} catch (ArithmeticException e) {System.out.println("");} } public static void test(int a, int b) throws ArithmeticException{ // 使用throws关键字指定异常类型System.out.println(a/b); }
-
自定义异常
- 使用 Java 内置的异常类可以描述编程时出现的大部分异常情况
- 用户自定义异常类,只需继承
Exception
类即可 - 自定义异常类的步骤:
- 创建自定义异常类
- 在方法中通过
throw
关键字抛出异常对象 - 如果在当前抛出异常的方法中处理异常,可以使用 try-catch 语句捕获并处理,否则在方法的声明处通过
throws
关键字指明要抛出给方法调用者的异常类,交由方法调用者处理异常