Java异常
Java异常
在 Java 中,异常是在程序运行过程中出现的错误情况的信号。
一、异常的分类

1.受检异常(Checked Exception):
- 也称为编译时异常,在编译阶段必须进行处理,否则程序无法通过编译。
- 例如IOException、SQLException等。
- 通常是由于外部因素导致的异常情况,比如文件读取错误、数据库连接问题等。
2.运行时异常(Runtime Exception):
- 也称为未检查异常,在编译阶段可以不进行处理。
- 例如NullPointerException、ArrayIndexOutOfBoundsException等。
- 通常是由于程序内部的错误导致的,比如空指针引用、数组越界访问等。
3.错误(Error):
- 一般是由 JVM 自身的问题或者系统资源耗尽等严重问题导致的,通常无法在程序中进行处理。
- 例如OutOfMemoryError、StackOverflowError等。
二、异常的处理机制
1.try-catch语句:
- try块中包含可能会抛出异常的代码。
- catch块用于捕获特定类型的异常并进行处理。可以有多个catch块来处理不同类型的异常。
例如:
try {
// 可能抛出异常的代码
} catch (ExceptionType1 e1) {
// 处理 ExceptionType1 异常的代码
} catch (ExceptionType2 e2) {
// 处理 ExceptionType2 异常的代码
}
2.finally块:
- 无论是否发生异常,finally块中的代码都会被执行。通常用于释放资源,如关闭文件、数据库连接等。
例如:
try {
// 可能抛出异常的代码
} catch (Exception e) {
// 处理异常的代码
} finally {
// 释放资源的代码
}
3.throws关键字:
- 在方法声明处使用throws关键字,表示该方法可能会抛出指定类型的异常。调用该方法的代码需要进行异常处理。
例如:
public void method() throws IOException {
// 可能抛出 IOException 的代码
}
4.throw关键字:
- throw用于在方法内部主动抛出一个异常对象。
例如:
public void someMethod() {
if (someCondition) {
throw new IllegalArgumentException("Invalid argument.");
}
// 其他代码
}
通常在特定条件下,当程序检测到错误情况时,可以使用throw来抛出一个异常,以便将错误信息传递给上层调用者进行处理。
三、自定义异常
可以通过继承Exception类或RuntimeException类来创建自定义异常。自定义异常可以携带特定的错误信息,以便更好地进行错误处理和调试。
例如:
class MyCustomException extends Exception {
public MyCustomException(String message) {
super(message);
}
}
在使用自定义异常时,可以像使用系统内置异常一样进行抛出和捕获。
四、异常的优点
- 提高程序的可靠性:通过捕获和处理异常,可以避免程序因错误而崩溃,提高程序的稳定性。
- 增强程序的可读性:明确地处理异常可以使代码更易于理解,开发者可以清楚地知道可能出现的错误情况以及如何处理。
- 方便调试:异常信息可以提供有关错误的详细信息,有助于开发者快速定位和解决问题。
扩展
1.final、finally、finalise的区别
final:用于修饰变量、方法和类:
- 修饰变量:表示变量一旦被初始化后就不能被重新赋值。被final修饰的基本数据类型变量的值不能改变,被final修饰的引用类型变量不能再指向其他对象,但对象的内容可以改变。
- 修饰方法:表示该方法不能被子类重写。
- 修饰类:表示该类不能被继承。
finally
- 用于try-catch语句块中,无论是否发生异常,finally块中的代码一定会被执行。
- 通常在finally块中放置一些必须执行的清理代码,如关闭文件、释放数据库连接等资源。
finalize ()
- 是Object类中的一个方法。
- 当垃圾回收器确定不存在对该对象的更多引用时,由垃圾回收器在对象被回收之前调用该方法。
- 一般不建议主动调用这个方法,因为垃圾回收的时间是不确定的,并且 Java 的垃圾回收机制已经足够强大,通常不需要手动干预对象的回收过程。同时,finalize()方法可能会带来一些性能问题和不确定性。
2.try-catch-finally 结构中,return 语句的执行顺序
1)执行 try 块中的代码
- 如果没有异常发生,并且 try 块中有 return 语句,那么这个 return 语句的值会被确定,但此时并不会立即返回。
- 如果有异常发生,程序流程会跳转到相应的 catch 块。
2)如果有异常发生并且有匹配的 catch 块:
- 执行 catch 块中的代码。
- 如果 catch 块中有 return 语句,这个 return 语句的值会被确定,但同样不会立即返回。
3)无论是否有异常发生,都会执行 finally 块中的代码:
- 如果 finally 块中也有 return 语句,那么这个 return 语句会覆盖 try 块或 catch 块中确定的返回值,最终方法将返回 finally 块中的 return 值。
- 如果 finally 块中没有 return 语句,但对要返回的变量进行了修改,那么修改后的结果也会作为最终的返回值(前提是变量是基本类型以外的引用类型,因为基本类型的值在 try 或 catch 中确定后不能被修改)。
总之,finally 块在 try-catch 结构中一定会执行,并且 finally 块中的 return 语句具有最高优先级,可以覆盖 try 块和 catch 块中确定的返回值。
浙公网安备 33010602011771号