Java ------异常 与 异常处理
发布日期:2021-05-08 12:14:38 浏览次数:21 分类:精选文章

本文共 2714 字,大约阅读时间需要 9 分钟。

异常与异常处理

在编程过程中,异常是不可避免的现象。就像在生活中身体可能会出现异常一样,程序在执行时也可能因为各种原因出现非正常情况,导致程序无法正常运行。Java作为一个面向对象的编程语言,提供了一套完整的异常处理机制,帮助开发者有效管理和应对程序中的异常情况。

异常概念

异常(Exception)是指程序在执行过程中出现的非正常情况,通常会导致JVM的非正常停止。在Java中,异常是一个类,通过抛出异常对象来表示程序出现了问题。Java的异常处理机制属于中断处理模型,与其他语言如C++等的异常处理机制类似。

需要注意的是,异常与语法错误是不同的概念。语法错误会导致编译失败,而异常则是在程序运行时发生的问题。例如,调用一个不存在的方法会抛出一个NullPointerException异常,而语法错误如未正确关闭文件描述符则会导致编译器错误。

异常体系

Java的异常体系基于Throwable类,分为两大类:ErrorExceptionError表示严重错误,这类错误通常是无法预见的,程序员无法通过代码处理,只能通过避免其发生来应对。Exception则表示可以通过代码处理的异常,这类异常是程序运行中的常见问题,需要通过捕获和处理来继续程序的执行。

Throwable类的常用方法包括:

  • public void printStackTrace(): 打印异常的详细信息,包括异常类型、原因和发生位置。
  • public String getMessage(): 获取异常的原因描述。
  • public String toString(): 获取异常的类型和描述信息。

通过这些方法,开发者可以获取异常信息,帮助定位问题。

异常分类

异常可以分为两类:编译时异常(Checked Exception)和运行时异常(Runtime Exception)。编译时异常在编译阶段会被检测到,程序员必须通过捕获或声明抛出来处理。而运行时异常则是在程序运行时才会被发现,通常是由于错误的使用导致的,如空指针异常或数组越界异常。

在自定义异常时,开发者可以继承Exception类来创建编译时异常,或者继承RuntimeException类来创建运行时异常。例如:

public class MyException extends Exception {    public MyException(String msg) {        super(msg);    }}

异常的产生过程解析

通过一个简单的数组越界例子,我们可以了解异常的产生过程。以下是代码的解释:

public class ArrayTools {    public static int getElement(int[] arr, int index) {        int element = arr[index];        return element;    }}public class ExceptionDemo {    public static void main(String[] args) {        int[] arr = {34, 12, 67};        int num = ArrayTools.getElement(arr, 4);        System.out.println("num=" + num);        System.out.println("over");    }}

程序执行过程如下:

  • 调用ArrayTools.getElement(arr, 4)
  • 检查索引4是否在有效范围内(0到arr.length-1)。
  • 索引4超出了数组的有效范围,抛出ArrayIndexOutOfBoundsException异常。
  • JVM捕获异常并终止程序执行,避免继续执行后续代码。
  • 异常处理

    Java提供了五个关键字来处理异常:trycatchfinallythrowthrows。这些关键字帮助开发者捕获异常、处理异常或将异常抛出给调用者。

    2.1 抛出异常(throw)

    在方法中,当参数不合法时,应抛出一个异常对象通知调用者。使用throw关键字可以将异常对象抛出:

    throw new IllegalArgumentException("参数不合法");

    2.2 Objects非空判断

    java.util.Objects类提供了一些静态方法来处理空指针问题。例如,Objects.requireNonNull方法会抛出NullPointerException异常,如果传入的对象为null

    Objects.requireNonNull(sc);

    2.3 声明异常(throws)

    在方法中使用throws关键字声明可能抛出的异常。例如:

    public static void read(String path) throws IOException {    // 读取文件    Files.readAllLines(path);}

    2.4 捕获异常(try-catch)

    使用try-catch语句块来捕获和处理异常。例如:

    try {    read("b.txt");} catch (FileNotFoundException e) {    System.out.println("文件不存在");}

    2.5 finally代码块

    finally代码块用于在异常处理后执行一定的操作,例如关闭资源。例如:

    try {    // 可能抛出异常的代码} catch (Exception e) {    // 处理异常} finally {    System.out.println("资源已关闭");}

    2.6 异常注意事项

    • 多个异常可以一次捕获并处理。
    • 运行时异常可以不处理,但编译时异常必须处理或声明抛出。
    • finally代码块的执行顺序和返回值传递需要注意。

    自定义异常

    可以通过继承ExceptionRuntimeException来创建自定义异常类。例如:

    public class MyException extends Exception {    public MyException(String msg) {        super(msg);    }}

    总结

    异常是程序开发中的常见问题,Java通过完善的异常处理机制帮助开发者有效管理异常。理解异常的概念、分类和处理方式,是成为高效的Java开发者不可或缺的能力。

    上一篇:JavaScript中的-----BOM(浏览器对象模型)
    下一篇:Java中的集合---------Collections 类---集合的工具类 Comparator比较器

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年04月08日 04时49分47秒