Java有几类异常?
Java中主要有三类异常:
-
检查异常:必须在代码中进行处理或者向调用者声明抛出,否则无法通过编译。示例包括 IOException 等文件或网络操作中的异常。
-
运行时异常:可以不进行捕获或者抛出声明,如果没被处理,则会导致程序崩溃或异常退出。示例包括 NullPointerException 等空指针异常、ArrayIndexOutOfBoundsException 等数组角标越界异常、ClassCastException 等类型转换异常、IllegalArgumentException 等非法参数异常等。
-
错误:是指发生错误时可以抛出的异常。示例包括 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块来确保资源的正确关闭和释放。
- 避免捕获异常后不进行处理或者仅进行简单的打印,应该在合适的层级进行异常处理。