Java异常



异常(Exceptions)是 Java 中用于处理程序运行时错误和异常情况的一种机制。异常是一种对象,用于表示发生的错误或异常情况,并提供了一种机制来捕获和处理这些错误,以确保程序的健壮性和可维护性。

try {
    // 可能引发异常的代码
    int result = 10 / 0;  // 这将引发 ArithmeticException
} catch (ArithmeticException e) {
    // 处理 ArithmeticException 异常
    System.out.println("ArithmeticException caught: " + e.getMessage());
} catch (Exception e) {
    // 处理其他异常(一般性的异常处理)
    System.out.println("Exception caught: " + e.getMessage());
} finally {
    // finally 块中的代码总是执行
    System.out.println("Finally block executed");
}

一. 与事件处理

1. 异常与事件处理的相似之处

两者都会打断正常的执行流程,将控制权转交给事件处理程序或异常处理程序。

2. 异常与事件处理的不同之处

异常用于处理非正常的、例外情况,而事件处理通常用于处理预期的事件。

二. 一些典型的异常

  • 文件未找到或不可访问。
  • 数组被错误地访问(超出边界)。
  • 除以零。
  • 对空指针进行解引用等。

三. 分类

在这里插入图片描述

1. Error 及其子类:

Error 类及其子类表示严重的问题,通常是虚拟机无法解决的问题。这些异常通常不应该被应用程序捕获或处理,因为它们表明了 JVM 或底层系统的内部错误。例如,OutOfMemoryError 是一种 Error,表示内存用尽。

2. RuntimeException 及其子类:

RuntimeException 及其子类是运行时异常,通常是由程序错误、逻辑错误或 API 滥用引起的。这些异常通常不能被合理地预测或从中恢复,应该在开发过程中修复代码问题,而不是捕获这些异常。例如,NullPointerException 是一种运行时异常,由于尝试访问空对象而引发。

3. Unchecked Exceptions:

运行时异常通常被称为未检查异常,因为编译器不会强制要求你捕获或声明它们。这些异常通常表示程序内部错误,无需在方法签名中声明它们。

非检查异常是指在运行时期抛出的异常,程序员不需要显式地去处理它们,但如果不进行处理,这些异常会导致程序终止。非检查异常主要包括 RuntimeException 及其子类,它们通常表示编程错误或逻辑错误,如 NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException 等。

非检查异常常见的异常类包括:

(1)NullPointerException

表示尝试访问一个空对象的属性或调用空对象的方法时抛出的异常。

(2)ArrayIndexOutOfBoundsException

表示尝试访问数组中超出有效索引范围的元素时抛出的异常。

(3)ArithmeticException

表示在算术运算中出现错误时抛出的异常,如除数为 0。

(4)ClassCastException

表示尝试将对象强制转换为不兼容的类型时抛出的异常。

(5)IllegalArgumentException

表示传递给方法的参数值不合法时抛出的异常。

(6)IllegalStateException

表示对象处于不合法的状态时抛出的异常。

(7)NumberFormatException

表示字符串转换为数字时格式错误时抛出的异常。
等等。

4. Checked Exception(其他所有异常):

除了 Error 和 RuntimeException 及其子类之外的所有异常都属于检查异常。这些异常可能在正常操作期间被抛出,并且可以合理地预测和处理。为了处理检查异常,Java 强制要求使用 try-catch 块或在方法签名中声明异常的抛出。

检查异常是指在编译时期强制要求处理的异常,程序在编译时会强制检查是否对这些异常进行了处理或者声明抛出。如果一个方法可能抛出检查异常,则该方法必须使用 try-catch 块或者 throws 关键字来处理这些异常。常见的检查异常包括 IOException、SQLException 等。

检查异常主要包括以下几种常见的异常类:

(1)IOException 及其子类

表示输入输出操作中可能出现的异常情况,如文件不存在、文件读取错误等。

(2)SQLException

表示数据库操作中可能出现的异常情况,如连接数据库失败、执行 SQL 语句错误等。

(3)ClassNotFoundException

表示尝试加载类时找不到类的异常情况。

(4)ParseException

表示解析字符串时遇到错误的异常情况,通常与日期、时间等相关的处理中使用。
等等。

四. try & catch

try {
    // 尝试执行可能抛出异常的代码
} catch (ExceptionType1 e1) {
    // 捕获 ExceptionType1 类型的异常,并处理
} catch (ExceptionType2 e2) {
    // 捕获 ExceptionType2 类型的异常,并处理
} finally {
    // 在无论是否发生异常的情况下都会执行的代码,通常用于资源释放或清理操作
}
  • try 块:包含了可能会抛出异常的代码。当代码块中发生异常时,异常会被抛出,然后被对应的 catch 块捕获。
  • catch 块:用于捕获 try 块中可能抛出的异常。可以有多个 catch 块,每个 catch 块用于捕获不同类型的异常。捕获异常后,可以在 catch 块中进行相应的处理,比如输出错误信息、日志记录或者重新抛出异常。
  • finally 块:用于执行清理操作,无论是否发生异常都会执行。通常用于释放资源或者进行清理操作,比如关闭文件流、数据库连接等。无论是否发生异常,finally 块中的代码都会被执行,即使在 try 或 catch 块中有 return 语句也会执行 finally 块。
public class Main {
    public static void main(String[] args) {
        try {
            // 尝试执行可能抛出异常的代码
            int result = divide(10, 0);
            System.out.println("Result: " + result);
        } catch (ArithmeticException e) {
            // 捕获 ArithmeticException 异常,并处理
            System.out.println("An error occurred: " + e.getMessage());
        }
    }

    public static int divide(int dividend, int divisor) {
        // 尝试执行可能抛出异常的代码
        return dividend / divisor;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值