多线程知识点目录
多线程并发(1)- https://www.jianshu.com/p/8fcfcac74033
多线程并发(2)-https://www.jianshu.com/p/a0c5095ad103
多线程并发(3)-https://www.jianshu.com/p/c5c3bbd42c35
多线程并发(4)-https://www.jianshu.com/p/e45807a9853e
多线程并发(5)-https://www.jianshu.com/p/5217588d82ba
多线程并发(6)-https://www.jianshu.com/p/d7c888a9c03c
一、异常处理机制
当一个方法遇到错误或无法完成任务时,它会抛出一个异常。这个异常可以是检查型异常(例如在尝试读取一个不存在的文件时),也可以是非检查型异常(例如空指针异常)。
当一个异常被抛出时,当前方法的执行会立即停止,控制权会传递给最近的、能够处理该异常的代码块。这个代码块可能是在当前方法外部的代码,也可能是同一个方法中的另一个try-catch块。
另外,调用这个方法的其他代码也无法继续执行,异常处理机制会将代码执行交给异常处理器。
使用异常处理机制可以使程序更加健壮,能够处理并适当地响应在运行过程中可能出现的各种错误情况。良好的异常处理可以使程序更易于理解和维护,同时还可以提供更详细的错误信息,有助于调试和解决问题。
二、异常分类
Throwable是Java语言中所有错误或异常的超类。其子类为:
Error
和Exception
。
2.1 Error
是指Java运行时系统内部错误和资源耗尽错误。应用程序不会抛出该对象。如果出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止。
2.2 Exception
异常有两个分支,一个是运行时异常RuntimeException
,一个是检查异常CheckedException
。
2.2.1 RuntimeException
代表了一组在运行时可能会出现的异常情况。RuntimeException
类本身是所有运行时异常的基类,其子类代表了各种具体的运行时异常情况。例如空指针访问、数组越界等。这些错误通常是由于程序员的疏忽或错误导致的,而不是由于外部环境或不可预知的情况引起的。因此,Java编译器不会强制程序员显式地处理这些异常,而是在运行时抛出异常,由程序员自行处理。当一个RuntimeException
被抛出时,当前方法的执行会立即停止,控制权会传递给最近的、能够处理该异常的代码块。如果没有找到匹配的异常处理代码块,程序会终止。因此,在编写Java代码时,程序员应该尽可能地避免出现RuntimeException
,以确保程序的稳定性和健壮性。
常见的RuntimeException
及其含义:
- NullPointerException:当一个应用程序试图在需要对象的地方使用null时抛出。例如,调用一个空对象的实例变量或方法。
- IndexOutOfBoundsException:当索引超出范围时抛出,例如访问数组或字符串时。
- ArithmeticException:当出现异常的算术条件时抛出,例如除以零或浮点溢出。
- IllegalArgumentException:当向方法传递了一个不合法或不正确的参数时抛出。
- IllegalStateException:当方法处于非法或不合适的状态时抛出,例如关闭了一个已经关闭的流。
2.2.2 CheckedException
一般是外部错误,这种异常都发生在编译阶段,Java 编译器会强制程序去捕获此类异常,即会出现要求你把这段可能出现异常的程序进行 try catch,该类异常一般包括几个方面:
- 试图在文件尾部读取数据
- 试图打开一个错误格式的 URL
- 试图根据给定的字符串查找 class 对象,而这个字符串表示的类并不存在
三、异常的处理方式
3.1 捕获异常(try-catch)
当在try块中发生异常时,程序的控制流立即转移到相应的catch块。
try {
//可能会抛出异常的代码
int[] arr = new int[5];
arr[10] = 50; //会抛出ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
//处理异常
System.out.println("数组越界");
} finally {
//无论是否发生异常,这里的代码都会执行
System.out.println("程序结束");
}
3.2 抛出异常(throw)
在Java中,可以使用throw关键字抛出一个异常。这必须在一个方法中完成,并且该方法必须使用throws关键字声明它可能抛出的异常。
public void printOwing(double amount) throws Exception {
if (amount > 1000) {
throw new Exception("OWING too much");
} else {
System.out.println("amount: " + amount);
}
}
3.3 声明异常(throws)
当一个方法可能会抛出一个受检查的异常时,可以使用throws关键字声明该异常。这告诉编译器该方法可能会抛出异常,调用该方法的代码需要进行适当的异常处理。
public void printOwing(double amount) throws Exception {
if (amount > 1000) {
throw new Exception("OWING too much");
} else {
System.out.println("amount: " + amount);
}
}
3.4 throw
和throws
的区别
位置不同
-
throws
用在函数上,后面跟的是异常类,可以跟多个;而throw
用在函数内,后面跟的是异常对象。
功能不同
-
throws
用来声明异常,让调用者只知道该功能可能出现的问题,可以给出预先的处理方式;throw
抛出具体的问题对象,执行到throw
,功能就已经结束了,跳转到调用者,并将具体的问题对象抛给调用者。也就是说throw
语句独立存在时,下面不要定义其他语句,因为执行不到。 -
throws
表示出现异常的一种可能性,并不一定会发生这些异常;throw
则是抛出了异常,执行throw
则一定抛出了某种异常对象。 - 两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。