Java八股文面试题之Java异常(一)

Java有几类异常?

Java中主要有三类异常:

  1. 检查异常:必须在代码中进行处理或者向调用者声明抛出,否则无法通过编译。示例包括 IOException 等文件或网络操作中的异常。

  2. 运行时异常:可以不进行捕获或者抛出声明,如果没被处理,则会导致程序崩溃或异常退出。示例包括 NullPointerException 等空指针异常、ArrayIndexOutOfBoundsException 等数组角标越界异常、ClassCastException 等类型转换异常、IllegalArgumentException 等非法参数异常等。

  3. 错误:是指发生错误时可以抛出的异常。示例包括 OutOfMemoryError 等内存溢出错误、StackOverflowError 等栈溢出错误等。

此处给出Java异常类的层次结构图:

+--java.lang.Object
    +--java.lang.Throwable                          // 所有异常的基类
        +--java.lang.Exception                      // 编译期异常的基类
        |  +--java.io.IOException                  // IO 异常类
        |  +--java.lang.ClassNotFoundException     // 找不到类异常
        |  +--java.lang.InterruptedException       // 线程被打断异常
        |  +--java.lang.reflect.InvocationTargetException // 反射异常
        |  +--java.lang.RuntimeException            // 运行时异常
        |     +--java.lang.ArithmeticException      // 算术异常
        |     +--java.lang.ArrayIndexOutOfBoundsException // 数组下标越界异常
        |     +--java.lang.ClassCastException      // 类型转换异常
        |     +--java.lang.IllegalArgumentException // 参数非法异常
        |     +--java.lang.NullPointerException   // 空指针异常
        |     +--java.lang.NumberFormatException   // 数字格式异常
        |     +--java.lang.SecurityException       // 安全异常
        +--java.lang.Error                           // 错误
            +--java.lang.LinkageError               // 类加载及链接方面的错误
                +--java.lang.NoClassDefFoundError   // 找不到类定义异常
            +--java.lang.VirtualMachineError        // 虚拟机错误

可以看到,异常的祖先是Throwable类,下面又有两个重要的子类:Exception 和 Error ,那么下一个问题就是:

Exception 和 Error 有什么区别?

Exception:是Java编译期异常的基类,主要表示程序错误或操作异常,它可以被捕获并处理,使得程序能够正常继续执行。例如:IOException(输入输出异常)、SQLException(SQL异常) 等。

Error:是Java虚拟机错误或程序运行错误,通常表示系统资源不足或严重的编程错误,无法预测和恢复,只能让程序崩溃并退出。例如:OutOfMemoryError(内存不足错误)、StackOverflowError (栈溢出错误)等。

总的来说,Exception是程序可以预期并需要处理的异常,而Error是无法预期和处理的异常。


Java中的finally块的作用是什么?

finally块用于定义一些无论是否发生异常都需要执行的代码。无论异常是否被捕获或者处理,finally块中的代码总是会被执行。通常在finally块中进行一些资源的释放操作,比如关闭打开的文件或者释放数据库连接等。


Java中异常的继承体系是什么样的?

Java中所有异常都是从Throwable类继承而来。Throwable类有两个重要的子类:Error和Exception。其中,Error表示严重的系统错误,通常无法恢复,而Exception则表示可被捕获和处理的异常。


Java中的Checked Exception和Unchecked Exception有什么区别?

Checked Exception是在编译时检查的异常,必须在代码中进行处理,否则编译会失败。常见的Checked Exception包括IOException和SQLException等。而Unchecked Exception(也称为RuntimeException)是不需要在代码中显式处理的异常,通常是程序逻辑错误引起的。常见的Unchecked Exception包括NullPointerException和ArrayIndexOutOfBoundsException等。


Java中的异常处理机制是什么样的?

Java使用try-catch块来处理异常。代码段被放置在try块中,如果在执行该代码时抛出异常,就会跳转到匹配的catch块进行处理。如果没有合适的catch块来捕获异常,异常将会被传递给上一级调用者,直到找到合适的catch块或者程序终止。


什么是异常链(Exception Chaining)?

异常链是指在处理异常时,其中一个异常的cause(原因)是另一个异常。通过异常链,我们可以追踪异常的触发源和传播路径。在Java中,通过getCause()方法来获取异常链中的原因异常。


Java中的Exception和Error有什么区别?

  • Exception用于表示程序运行期间可能出现的异常情况,可以通过捕获和处理来处理这些异常。
  • Error则表示严重的系统错误,通常无法恢复,可用于表示虚拟机相关的问题或其它不可预料的严重错误。

什么是运行时异常(RuntimeException)?

运行时异常是指在程序运行过程中可能发生的异常,可以不强制要求进行捕获和处理。常见的运行时异常包括NullPointerException、ArrayIndexOutOfBoundsException等。


try-with-resources语句是什么?它用于什么场景?

try-with-resources语句是Java 7中引入的一种语法,用于自动关闭实现了java.lang.AutoCloseable接口的资源。通过在try语句中声明和初始化资源,无需手动关闭资源,确保资源得到释放。这对于处理流、数据库连接和文件操作等场景特别有用。


throws关键字和throw关键字有什么不同?

  • throws关键字用于方法签名中,表示该方法可能抛出的异常类型,它是方法声明时的一部分。
  • throw关键字用于抛出具体的异常实例或者Throwable类型,将异常抛给上层的调用者或异常处理器。

什么是异常处理的最佳实践?

  • 选择合适的异常类型,这样可以提供更加准确的错误信息,并使代码更容易理解和维护。
  • 使用多个catch块进行详细的异常处理,处理不同类型的异常以提供恰当的响应。
  • 在catch块中进行适当的日志记录,以便追踪和调试异常情况。
  • 合理利用finally块来确保资源的正确关闭和释放。
  • 避免捕获异常后不进行处理或者仅进行简单的打印,应该在合适的层级进行异常处理。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值