一、在Java中,常见的运行时异常(RuntimeException)包括以下几种:
- NullPointerException:当应用程序试图访问空对象时,会抛出此异常。简单地说,就是调用了未经初始化的对象或者是不存在的对象。
- ArrayIndexOutOfBoundsException(下标越界异常):当访问数组的索引超出范围时,会抛出此异常。
- ClassCastException(类转换异常):当试图将一个对象强制转换为不兼容的类时,会抛出此异常。
- IllegalArgumentException(非法参数异常):当向方法传递不合法的参数时,会抛出此异常。
- ArithmeticException(算术异常):当在算术运算中发生错误时,例如除以零,会抛出此异常。
- UnsupportedOperationException(不支持的操作异常):当调用一个不支持的方法或操作时,会抛出此异常。
- ConcurrentModificationException(并发修改异常):当在迭代集合对象的过程中,使用了不允许的修改操作时,会抛出此异常。
- NumberFormatException(数字格式异常):当试图将一个字符串转换为数字,但该字符串的格式不正确时,会抛出此异常。
- SecurityException(安全异常):由安全管理器抛出的异常,指示存在安全侵犯。
此外,还有其他的运行时异常,如InstantiationException(实例化异常,当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出)、StackOverflowError(堆栈溢出错误,当一个应用递归调用的层次太深而导致堆栈溢出时抛出)等。
请注意,以上列举的异常并非全部,Java中还有许多其他的运行时异常。当编写Java程序时,应当熟悉这些异常,并学会如何正确地处理它们,以提高程序的健壮性和稳定性。
二、在Java中,捕获和处理异常通常使用try-catch块。当你预计某段代码可能会抛出异常时,你可以将这段代码放在try块中,并在catch块中处理这个异常。以下是一个简单的示例,展示了如何捕获和处理异常:
| public class ExceptionHandlingExample {  | |
| public static void main(String[] args) {  | |
| try {  | |
| // 可能会抛出异常的代码  | |
| int result = 10 / 0; // 这会抛出ArithmeticException  | |
| } catch (ArithmeticException e) {  | |
| // 处理ArithmeticException异常的代码  | |
| System.out.println("捕获到算术异常: " + e.getMessage());  | |
| } catch (Exception e) {  | |
| // 处理其他类型异常的代码(可选)  | |
| // 注意:通常不建议捕获所有异常(Exception),除非你确实打算处理所有类型的异常  | |
| System.out.println("捕获到异常: " + e.getMessage());  | |
| e.printStackTrace(); // 打印异常的堆栈跟踪信息  | |
| } finally {  | |
| // 无论是否发生异常都会执行的代码(可选)  | |
| System.out.println("finally块中的代码,无论是否发生异常都会执行");  | |
| }  | |
| }  | |
| } | 
在这个示例中,我们尝试执行一个会导致ArithmeticException的除法操作(除以0)。这个操作被放在try块中,因此如果发生异常,控制流将转移到相应的catch块。在这个例子中,我们有一个专门捕获ArithmeticException的catch块,它会打印出一条错误消息。
如果try块中的代码抛出了其他类型的异常(在这个示例中没有),并且没有相应的catch块来捕获它,那么异常将会继续向上传播,直到找到一个能够处理它的catch块,或者如果没有找到,那么程序将会终止并打印出异常的堆栈跟踪信息。
finally块是可选的,它包含的代码无论是否发生异常都会执行。这通常用于执行清理操作,如关闭文件或网络连接。注意,如果在try或catch块中使用了return、break或continue语句,那么finally块仍然会执行,但finally块之后的代码(如果有的话)可能不会执行。
另外,还可以使用throw语句手动抛出异常。这在需要向调用者指示某个错误条件时非常有用。例如:
java复制代码
| if (someCondition) {  | |
| throw new IllegalArgumentException("参数不合法");  | |
| } | 
在这个例子中,如果someCondition为真,那么就会抛出一个IllegalArgumentException,调用者必须处理这个异常(除非它在另一个try-catch块中)。