异常分类与处理

Java异常类层次结构图2

核心卷1书上是这个图。

在java中,所有的异常都有一个共同的祖先java.lang包中的Throwable类。Throwable类有两个重要的子类Exception(异常)和Error(错误)。Exception能被程序本身处理,Error是无法处理的(只能尽力避免)。

exception和error二者都是java异常处理的重要子类,各自都包含大量子类。

1、exception:程序本身可以处理的异常,可以通过catch来进行捕获。exception又可以分为 受检查异常(必须处理)和不受检查异常(可以不处理)。

2、error:属于程序无法处理的错误,我们没办法通过catch来进行捕获。例如,Java虚拟机运行错误(Virtual MachineError)、虚拟机内存不够错误(OutMemoryError)、类定义错误(NoClassDefFoundError)等。这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。

Java语言规范将派生于Error类或RuntimeException类的所有异常称为非收检查异常;所有其他类叫受检查异常。

受检查异常

Java 代码在编译过程中,如果受检查异常没有被 throw(抛出)/catch(捕获) 处理的话,就没办法通过编译 。比如IOException

除了RuntimeException 及其子类以外,其他的Exception类及其子类都属于受检查异常 。常见的受检查异常有: IO 相关的异常、ClassNotFoundExceptionSQLException…。

不受检查异常(RuntimeException)

Java 代码在编译过程中 ,我们即使不处理不受检查异常也可以正常通过编译。

RuntimeException 及其子类

NullPointerException、NumberFormatException(字符串转换为数字)、ArrayIndexOutOfBoundsException`(数组越界)、ClassCastException(类型转换错误)、ArithmeticException(算术错误)等。

3.2.2 Throwable类常用方法

getmessage():返回异常发生时的简要描述

toString():返回异常发生时的详细信息

3.2.3 抛出异常和捕获异常

throws 可以自定义创建异常类

try-catch
  • try:用于捕获异常。其后可接零个或多个 catch 块,如果没有 catch 块,则必须跟一个 finally 块。

  • catch块: 用于处理 try 捕获到的异常。

    catch(IOException e){

    e.printStackTrace();

    }

  • finally 块: 无论是否捕获或处理异常,finally 块里的语句都会被执行。当在 try 块或 catch 块中遇到 return 语句时,finally 语句块将在方法返回之前被执行。

    但是3种特殊情况下,finally块不会被执行:

    1、在try或者finally块中用了System.exit(int) 退出程序。但是,如果System.exit(int) 在异常语句之后,fi nally还是会被执行。

    2、程序所在的线程死亡;

    3、关闭CPU。

注意: 当 try 语句和 finally 语句中都有 return 语句时,在方法返回之前,finally 语句的内容将被执行,并且 finally 语句的返回值将会覆盖原始的返回值。

public class Test {
    public static int f(int value) {
        try {
            return value * value;
        } finally {
            if (value == 2) {
                return 0;
            }
        }
    }
}

如果调用 f(2),返回值将是 0,因为 finally 语句的返回值覆盖了 try 语句块的返回值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值