👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO TOP红人

Java知识图谱点击链接:体系化学习Java(Java面试专题)

💕💕 感兴趣的同学可以收藏关注下不然下次找不到哟💕💕

✊✊ 感觉对你有帮助的朋友,可以给博主一个三连,非常感谢 🙏🙏🙏

【面试必背知识】Java 中常见的异常有哪些?_异常


文章目录

  • 写在前面
  • 1、什么是异常
  • 2、Exception、Error 和 Throwable 三者的区别
  • 3、异常的作用
  • 4、常见的 Exception 有哪些?
  • 5、常见的 Error 有哪些?
  • 6、Exception 处理方式/用法
  • 🐚 6.1、捕获并处理特定类型的异常
  • 🐚 6.2、捕获并处理多个类型的异常
  • 🐚 6.3、使用finally块进行清理操作
  • 🐚 6.4、抛出自定义异常
  • 写在最后


写在前面

🔔 面试中常问到的一个问题 “你在工作中遇到过什么异常?”,面对这个问题,我们该怎么去回答呢?我们可以从以下几个方面去回答他,首先介绍什么是异常,异常有什么作用,常见的异常有哪些,然后挑一个举例说明怎么遇到这种异常,面对异常我们该如何处理

1、什么是异常

Java异常是在程序执行过程中发生的意外或异常情况。当程序遇到错误或异常时,它会抛出一个异常对象,该对象包含有关错误的信息。Java异常机制允许程序员捕获和处理这些异常,以便在出现问题时采取适当的措施。

Java异常分为两种类型:已检查异常(Checked Exceptions)和未检查异常(Unchecked Exceptions)

  • 🌴 已检查异常:是指在编译时强制检查的异常,必须在代码中显式地处理或声明抛出。例如,IOException和SQLException就是已检查异常。
  • 🌴 未检查异常:是指在编译时不强制检查的异常,不需要在代码中显式地处理或声明抛出。常见的未检查异常包括NullPointerException、ArrayIndexOutOfBoundsException和ArithmeticException等。

此外,还有一个特殊的异常类型是Error,它表示严重的错误情况,通常是由于系统级问题导致的,例如OutOfMemoryError和StackOverflowError。

通过使用try-catch语句块,可以捕获并处理异常。当异常被捕获时,可以执行相应的处理逻辑,或者抛出异常以供上层调用者处理。异常处理可以帮助程序在出现错误时进行优雅的恢复或报告错误信息,以提高程序的健壮性和可靠性。

2、Exception、Error 和 Throwable 三者的区别

  1. 🌴 Exception(异常):Exception是Java中表示可被程序捕获和处理的异常情况的类。异常又分为两类:已检查异常(checked exceptions)和未检查异常(unchecked exceptions)。已检查异常在编译时进行检查,必须在代码中显式处理或在方法签名中使用"throws"关键字声明。已检查异常的例子包括IOException和SQLException。未检查异常则不需要显式声明或捕获,通常是由于编程错误或意外情况引起的,比如NullPointerException或ArrayIndexOutOfBoundsException。
  2. 🌴 Error(错误):Error也是Java中的一个类,表示通常超出程序控制范围的严重问题。错误通常是由外部因素或JVM或系统的基本问题引起的。错误的例子包括OutOfMemoryError和StackOverflowError。与异常不同,错误通常不应该被程序捕获和处理,因为它们表示严重的问题,可能是无法恢复的。
  3. 🌴 Throwable(可抛出的):Throwable是异常和错误的超类,为程序中捕获和传播异常和错误提供基本功能。Throwable类有两个直接子类:Exception和Error,参考下面源码。

【面试必背知识】Java 中常见的异常有哪些?_面试_02


【面试必背知识】Java 中常见的异常有哪些?_java_03

3、异常的作用

Java异常的作用是在程序执行过程中处理错误和异常情况。它们允许程序员在出现问题时采取适当的措施,以保证程序的健壮性和可靠性。

以下是Java异常的几个主要作用:

  1. 🌴 错误处理:异常提供了一种机制来处理程序中可能发生的错误情况。通过捕获和处理异常,程序可以在出现错误时执行相应的逻辑,以避免程序崩溃或产生不可预料的结果。
  2. 🌴 异常传播:当一个方法遇到异常时,它可以选择将异常传播给调用它的方法。这样,异常可以在调用栈中向上传递,直到找到能够处理异常的地方。这种异常传播机制使得程序可以在合适的地方处理异常,而不需要在每个方法中都进行异常处理。
  3. 🌴 调试和诊断:异常提供了一种诊断程序问题的方式。当程序抛出异常时,它会提供有关错误的详细信息,包括异常类型、堆栈跟踪和错误消息。这些信息可以帮助程序员快速定位和修复问题。
  4. 🌴 异常处理策略:通过使用不同类型的异常,程序可以实现不同的异常处理策略。例如,可以使用不同的异常类来表示不同的错误类型,并针对每种类型的异常采取不同的处理方式。这样可以使程序更加灵活和可维护。

4、常见的 Exception 有哪些?

在Java中,常见的Exception包括但不限于以下几种:

  1. 🌴 NullPointerException(空指针异常):当尝试使用空引用调用对象的方法或访问对象的字段时抛出。
  2. 🌴 ArrayIndexOutOfBoundsException(数组越界异常):当尝试访问数组中不存在的索引时抛出。
  3. 🌴 IllegalArgumentException(非法参数异常):当传递给方法的参数不满足方法的要求时抛出。
  4. 🌴 IllegalStateException(非法状态异常):当对象的状态不符合方法调用的前提条件时抛出。
  5. 🌴 IOException(输入输出异常):在处理输入输出操作时发生错误时抛出。
  6. 🌴 ClassNotFoundException(类未找到异常):当尝试加载不存在的类时抛出。
  7. 🌴 InterruptedException(中断异常):在线程等待、休眠或阻塞的过程中被中断时抛出。
  8. 🌴 SQLException(SQL异常):在访问数据库时发生错误时抛出。
  9. 🌴 FileNotFoundException(文件未找到异常):当尝试访问不存在的文件时抛出。
  10. 🌴 ArithmeticException(算术异常):在算术操作中出现错误时抛出,例如除以零。

这些是Java中常见的异常类型,程序员在编写代码时需要注意捕获和处理这些异常,以确保程序的稳定性和可靠性。

5、常见的 Error 有哪些?

在Java中,常见的Error包括但不限于以下几种:

  1. 🌴 OutOfMemoryError(内存溢出错误):当Java虚拟机无法为对象分配足够的内存空间时抛出。
  2. 🌴 StackOverflowError(栈溢出错误):当方法调用的调用栈超过其限制时抛出,通常是由于递归调用导致的。
  3. 🌴 NoClassDefFoundError(类未定义错误):当Java虚拟机无法找到类的定义时抛出,通常是由于类路径配置错误或类文件缺失引起的。
  4. 🌴 LinkageError(链接错误):当Java虚拟机在类加载过程中遇到链接错误时抛出,例如类与其依赖的类不兼容。
  5. 🌴 AssertionError(断言错误):当断言语句失败时抛出,通常用于在代码中检查预期的条件是否满足。
  6. 🌴 VirtualMachineError(虚拟机错误):表示Java虚拟机内部发生了错误,例如栈溢出、垃圾回收失败等。
  7. 🌴 InternalError(内部错误):表示Java虚拟机内部发生了严重的错误,无法恢复。

这些错误通常是Java虚拟机或底层系统出现严重问题导致的,一般情况下无法通过代码来处理和恢复。程序员通常无法捕获和处理这些错误,而是需要对代码和环境进行调整和修复。

6、Exception 处理方式/用法

在Java中,我们可以使用try-catch语句块来处理异常。try块用于包含可能会抛出异常的代码,而catch块用于捕获并处理异常。以下是几种处理异常的常见用法,并附带示例代码说明:

🐚 6.1、捕获并处理特定类型的异常

🌴 在捕获的异常里面我们就可以做一些业务操作,例如:异常了,我们的业务需要回滚。

try {
    // 可能会抛出异常的代码
    int result = 10 / 0; // 除以零会抛出ArithmeticException
} catch (ArithmeticException e) {
    // 捕获并处理ArithmeticException异常
    System.out.println("除以零错误发生:" + e.getMessage());
}

🐚 6.2、捕获并处理多个类型的异常

此处注意,异常的捕获是逐步向下的,平级的异常无所谓上下方,但是 Exception 这种父类异常,要放在子类异常的下面,否则会被 Exception 捕获。

try {
    // 可能会抛出异常的代码
    String str = null;
    str.length(); // str为null,会抛出NullPointerException
} catch (NullPointerException e) {
    // 捕获并处理NullPointerException异常
    System.out.println("空指针异常发生:" + e.getMessage());
} catch (ArithmeticException e) {
    // 捕获并处理ArithmeticException异常
    System.out.println("除以零错误发生:" + e.getMessage());
}

🐚 6.3、使用finally块进行清理操作

try {
    // 可能会抛出异常的代码
    // ...
} catch (Exception e) {
    // 捕获并处理异常
    // ...
} finally {
    // 在try或catch块执行后,无论是否发生异常,都会执行的代码块
    // 通常用于进行资源的释放或清理操作,如关闭文件、数据库连接等
    // ...
}

🐚 6.4、抛出自定义异常

public class CustomException extends Exception {
    public CustomException(String message) {
        super(message);
    }
}

public class Example {
    public static void main(String[] args) {
        try {
            // 抛出自定义异常
            throw new CustomException("自定义异常信息");
        } catch (CustomException e) {
            // 捕获并处理自定义异常
            System.out.println("自定义异常发生:" + e.getMessage());
        }
    }
}

这些是Java中处理异常的几种常见用法。通过使用try-catch语句块,我们可以捕获并处理可能发生的异常,从而保证程序的稳定性和可靠性。

写在最后

异常不仅仅是面试中会问到,在我们编程中也是息息相关的,相信大家都遇到过很多异常,处理这些异常的经验也是我们的瑰宝。

💕💕 本文由激流原创,原创不易,希望大家关注、点赞、收藏,给博主一点鼓励,感谢!!!

🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃

【面试必背知识】Java 中常见的异常有哪些?_面试_04