Java 异常处理详细解读

异常(Exception)指的是所有可能造成计算机无法正常处理的情况。发生异常时,将阻止程序的运行,若不妥善处理异常,可能造成计算机死机。经过异常处理,可以保证程序的正常运行,我们把针对不同的异常做妥善的处理的方式叫做“异常处理机制”。

异常处理的目的:加强程序的健壮性、安全性。

Java 中,所有的异常都被封装到相应的类中,同时,用户也可以自定义异常类和自定义抛出异常。

  • 抛出异常(throw):是指将异常提交给运行时系统的过程。
  • 捕获异常(catch):是指运行时系统找到发生异常的方法的过程。

异常类 Throwable

异常类是指由程序抛出的异常对象所属的类。

异常可以分为两大类: java.lang.Exception 类和 java.lang.Error 类。这两个类均继承自 java.lang.Throwable 类

  • Error 类通常指的是 JVM 出错和线程死锁,用户无法在程序中处理(无法捕获)
  • Exception 类通常指的是可以处理的异常,分为编译时异常和运行时异常(RuntimeException),编译时异常是 Exception 下除了运行时异常以外的所有异常
    • 对于编译时异常,不解决编译就不会通过
    • 对于运行时异常,可以选择性地来进行处理,如果不处理则出现异常时将交给 JVM 默认处理

获取异常信息的方法

Java 中常见的异常类

异常描述
NullPointerException空指向异常(空指针异常)。指的是使用了一个未初始化的对象(未开辟内存空间的对象)。
ArithmeticException算术异常。如:除以零
ArrayIndexOutOfBoundsException数组下标越界异常。数组的索引超过了上界或下界
FileNotFoundException文件未找到异常
OutOfMemoryExceptin内存溢出异常(内存不足异常)。可用内存不足以分配给一个对象时抛出
NoSuchElementExceptin调用了类集中不存在的元素
ClassCastExceptin对象与类集中的元素不兼容
UnsupportedOperationExceptin修改一个不允许修改的对象

异常处理 try-catch-finally

死了都要 try,不 try 到 catch 不痛快

当发生异常时,通常有两种处理方法:

try-catch-finally

异常处理的语法:

try {
    // 要检查的语句
} catch (异常类 e) {
    // 异常发生时的处理语句
    e.printStackTrace(); // 打印异常信息
} finally {
    // 一定会运行到的语句
}
  • try 语句块不可以独立存在,必须与 catch 或 finally 同存,finally 语句块可以省略
  • catch 区块可以有多个,此时异常类型必须子类在前,父类在后
  • 当 try 区块捕获到异常时,不执行接下来的语句,立即进入 catch 区块

finally 语句块不会被执行的情况

  1. 在 finally 语句块中发生了异常
  2. 在前面的代码中使用了 System.exit() 退出程序
  3. 程序所在的线程死亡
  4. CPU 关闭

异常处理的几种形式

try…catch
try…catch…finally
try…finally

向上抛出异常 throws

方法头中使用 throws 关键字可以表明这个方法可能存在的异常类型,此方法不处理异常,而是将该异常提交给调用这个方法的方法。

public class Test {
    public static void main(String[] args) {
        int[] arr = new int[5];
        try {
            setZero(arr, 10);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("end");
    }

    public static void setZero(int[] arr, int index) throws ArrayIndexOutOfBoundsException {
        arr[index] = 0;
    }
}

自行抛出异常 throw

throws 用于方法声明中,声明一个方法会抛出哪些异常,而 throw 是方法体中实际执行抛出异常的动作。

throw 异常类型的实例
try {
    throw new ArrayIndexOutOfBoundsException("我是异常信息");
} catch (Exception e) {
    e.printStackTrace();
}

自定义异常类

当系统提供的异常类不足以满足业务需求时,我们可以自定义异常类

class 自定义异常类 extends 异常类型 {

}
public class Test {
    public static void main(String[] args) {
        try {
            throw new MyException("我是自定义异常类");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class MyException extends Exception {
    private String msg;

    public MyException(String msg) {
        this.msg = msg;
    }

    @Override
    public String toString() {
        return "MyException [msg=" + msg + "]";
    }
}
最后分享个java学习进阶交流群,想获取免费架构视频资料的请加群:779792048
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值